Sort系ステータス変数について

概要

http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html
マニュアルでは以下のように説明されている。

変数名 意味
Sort_range レンジを使用して行われたソートの回数。
Sort_scan テーブルをスキャンすることによって行われたソートの回数。
Sort_merge_passes ソートアルゴリズムが必要としたマージパスの数。この値が大きい場合、システム変数のsort_buffer_sizeの値を増やすことを検討すべきです。
Sort_rows ソートされた行数。

ステータス変数の実体

変数名 実体
Sort_range STATUS_VAR.filesort_range_count
Sort_scan STATUS_VAR.filesort_scan_count
Sort_merge_passes STATUS_VAR.filesort_merge_passes
Sort_rows STATUS_VAR.filesort_rows

Sort_rangeとSort_scan

filesort関数(sql/filesort.cc)内にて、select->quickが真か偽かによって、Sort_rangeとSort_scanのどちらがカウントアップされるかが決まる。

  if (select && select->quick)
  {
    statistic_increment(thd->status_var.filesort_range_count, &LOCK_status);
  }
  else
  {
    statistic_increment(thd->status_var.filesort_scan_count, &LOCK_status);
  }

Sort_merge_passes

merge_buffers関数(sql/filesort.cc)で、Sort_merge_passesは無条件にカウントアップされる。

  statistic_increment(current_thd->status_var.filesort_merge_passes,
                      &LOCK_status);

merge_buffers関数自体はいくつかの呼出元がある。filesort関数から1つ挟んで呼ばれてるのは確認済み。

システム変数sort_buffer_sizeの実体はsystem_variables.sortbuf_size。

Sort_rows

filesort関数(sql/filesort.cc)の戻り値によってこの値がカウントアップされている。

検証用テーブル

int,int,charの簡単なテーブルにデータを8件。c1はprimary key、c2はindexを付与。c3はインデックス無し。

[test] > select * from t2;
+----+------+------+
| c1 | c2   | c3   |
+----+------+------+
|  1 |   41 |    9 | 
|  2 |   20 |   75 | 
|  3 |   14 |   46 | 
|  4 |   87 |   97 | 
|  5 |   24 |   31 | 
|  6 |   81 |   14 | 
|  7 |   24 |   79 | 
|  8 |   24 |   84 | 
+----+------+------+
8 rows in set (0.00 sec)

select * from t2 order by c2のbacktrace

#0  filesort (thd=0xa0789b0, table=0xa0b3660, sortorder=0xa0b3090, s_length=1, select=0xa0b2fb0, max_rows=18446744073709551615, examined_rows=0xb4afa0d0) at filesort.cc:100
#1  0x08234728 in create_sort_index (thd=0xa0789b0, join=0xa0b1a88, order=0xa0b19f0, filesort_limit=18446744073709551615, select_limit=18446744073709551615) at sql_select.cc:12685
#2  0x08244900 in JOIN::exec (this=0xa0b1a88) at sql_select.cc:2020
#3  0x08240f2a in mysql_select (thd=0xa0789b0, rref_pointer_array=0xa079a60, tables=0xa0b1778, wild_num=1, fields=@0xa0799d0, conds=0x0, og_num=1, order=0xa0b19f0, group=0x0, having=0x0, proc_param=0x0, 
    select_options=2189707776, result=0xa0b1a78, unit=0xa079704, select_lex=0xa07993c) at sql_select.cc:2240
#4  0x08244d23 in handle_select (thd=0xa0789b0, lex=0xa0796a0, result=0xa0b1a78, setup_tables_done_option=0) at sql_select.cc:255
#5  0x081e4a8f in mysql_execute_command (thd=0xa0789b0) at sql_parse.cc:2670
#6  0x081ec48c in mysql_parse (thd=0xa0789b0, inBuf=0xa0b1658 "select * from t2 order by c2", length=28) at sql_parse.cc:5986
#7  0x081ee746 in dispatch_command (command=COM_QUERY, thd=0xa0789b0, packet=0xa0a9629 "select * from t2 order by c2", packet_length=29) at sql_parse.cc:1807
#8  0x081efb37 in do_command (thd=0xa0789b0) at sql_parse.cc:1586
#9  0x081f0bd9 in handle_one_connection (arg=0xa0789b0) at sql_parse.cc:1200
#10 0x00d0d302 in start_thread () from /lib/i686/nosegneg/libpthread.so.0
#11 0x00c6538e in clone () from /lib/i686/nosegneg/libc.so.6

マクロ CAN_TRUST_RANGE について

これ、デフォルトではONにならないようだ。しかもgrepしてもconfigureとかでONにする方法も提供されていない。

つまりどんなビルドパタンでも現状はfilesort.ccの175行目には入らないということ。