[+/-]
Index
Mergeメソッドは、複数のrange
スキャンを有する行を取得と、それぞれの結果を1つに結合するのにするのに使用されます。この結合によって、基礎スキャンの結合、共通集合、あるいは交差点の結合が生成されます。
EXPLAIN
出力では、インデックスメソッドはtype
カラムでindex_merge
として現れます。この場合、key
カラムは使用されたインデックスのリストが含まれ、key_len
はインデックスの最長キー部分が含まれます。
例:
SELECT * FROMtbl_name
WHEREkey1
= 10 ORkey2
= 20; SELECT * FROMtbl_name
WHERE (key1
= 10 ORkey2
= 20) ANDnon_key
=30; SELECT * FROM t1, t2 WHERE (t1.key1
IN (1,2) OR t1.key2
LIKE 'value
%') AND t2.key1
=t1.some_col
; SELECT * FROM t1, t2 WHERE t1.key1
=1 AND (t2.key1
=t1.some_col
OR 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法を使用して定義を分布してみてください。
(x
ANDy
) ORz
= (x
ORz
) AND (y
ORz
) (x
ORy
) ANDz
= (x
ANDz
) OR (y
ANDz
)
インデックス結合は、フルテキストインデックスには適用されません。将来的にリリースされるMySQLのバージョンでカバーできるよう、拡張する予定です。
種々のインデックス結合メソッドや他のアクセスメソッドの選択に関しては、選択肢のコスト予想によります。