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行目には入らないということ。