[+/-]
Index
Mergeメソッドは、複数のrangeスキャンを有する行を取得と、それぞれの結果を1つに結合するのにするのに使用されます。この結合によって、基礎スキャンの結合、共通集合、あるいは交差点の結合が生成されます。
EXPLAIN出力では、インデックスメソッドはtype
カラムでindex_mergeとして現れます。この場合、keyカラムは使用されたインデックスのリストが含まれ、key_lenはインデックスの最長キー部分が含まれます。
例:
SELECT * FROMtbl_nameWHEREkey1= 10 ORkey2= 20; SELECT * FROMtbl_nameWHERE (key1= 10 ORkey2= 20) ANDnon_key=30; SELECT * FROM t1, t2 WHERE (t1.key1IN (1,2) OR t1.key2LIKE 'value%') AND t2.key1=t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1=1 AND (t2.key1=t1.some_colOR t2.key2=t1.some_col2);
インデックス結合メソッドは複数のアクセスアルゴリズムがあります。(ExtraフィールドのEXPLAIN出力で見られます。)
Using intersect(...)
Using union(...)
Using sort_union(...)
以下のセクションはこれらのメソッドの詳細を記述しています。
注:インデックス結合最適化アルゴリズムには以下の欠点があります。
あるキーでレンジスキャンが可能な場合、インデックス結合は考慮されません。例えば、以下のクエリでは:
SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
このクエリでは、2つのプランが考えられます。
(goodkey1 < 10 OR goodkey2 <
20)条件を使用したインデックス結合スキャン。
badkey <
30条件を使用したレンジスキャン。
ただし、オプティマイザは2つ目のプランしか考慮しません。
ユーザのクエリに複雑なAND/OR入れ子を持つWHERE節があり、MySQLが最適なプランを選択しない場合、以下のID法を使用して定義を分布してみてください。
(xANDy) ORz= (xORz) AND (yORz) (xORy) ANDz= (xANDz) OR (yANDz)
インデックス結合は、フルテキストインデックスには適用されません。将来的にリリースされるMySQLのバージョンでカバーできるよう、拡張する予定です。
種々のインデックス結合メソッドや他のアクセスメソッドの選択に関しては、選択肢のコスト予想によります。
