MySQLのインデックス結合の概要をまとめました。
1)Index Mergeメソッド
複数のrangeスキャンを有する行の取得とそれぞれの結果を一つに結合するのに使用。
※rangeスキャン
インデックスを使用して、一定の範囲にあるレコードのみ(=、、>、>=、、BETWEEN、IN()などを使って定数と比較して取得)取得。
2)Explainの実行例
・typeカラムがindex_mergeと表示される。
・keyカラムは使用されたインデックスのリストが表示。
・key_lenカラムにはインデックスの最長キーパートが含まれる。
mysql> explain select * from sample where id_eki = '2164020' or build = '2010' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sample
type: index_merge
possible_keys: build,id_eki
key: id_eki,build
key_len: 33,5
ref: NULL
rows: 333
Extra: Using union(id_eki,build); Using where
1 row in set (0.00 sec)
mysql> explain select * from sample where (id_eki = '2164020' or build = '2010') and registday = '20150330' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sample
type: index_merge
possible_keys: build,id_eki
key: id_eki,build
key_len: 33,5
ref: NULL
rows: 333
Extra: Using union(id_eki,build); Using where
1 row in set (0.00 sec)
3)アクセスアルゴリズム
・”intersect”、”union”、”sort_union”のアクセスアルゴリズム
・EXPLAINの”Extra”カラムに表示される。
4)インデックス結合の注意点
・あるキーでrangeスキャンが可能な場合、インデックス結合ユニオンアルゴリズムやインデックス結合ソートユニオンアルゴリズムは考慮されない。
・インデックス結合は、フルテキストインデックスには適用されない。
・バッファ、ソート、マージ操作の過程で多くのCPUとメモリを消費する。
・インデックスの選択性が低い場合はマージによって多くの行をリターンする事になる。
5)インデックス結合を無効にするには?
①optimizer_switchシステム変数を使用
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,
index_merge_sort_union=on,
index_merge_intersection=on
mysql> SET optimizer_switch='index_merge_union=off,index_merge_sort_union=off';
②IGNORE INDEXヒントを使用する