MySQLのインデックス結合の概要

MySQLのインデックス結合の概要をまとめました。

1)Index Mergeメソッド


 
複数のrangeスキャンを有する行の取得とそれぞれの結果を一つに結合するのに使用。
 
※rangeスキャン
インデックスを使用して、一定の範囲にあるレコードのみ(=、<>、>、>=、<、<=、IS NULL、<=>、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ヒントを使用する

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です