[+/-]
Index Mergeメソッドは、複数の
range
スキャンを有する行を取得と、それぞれの結果を
1
つに結合するのにするのに使用されます。この結合によって、基礎スキャンの結合、共通集合、あるいは交差点の結合が生成されます。このアクセスメソッドは、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 のバージョンでカバーできるよう、拡張する予定です。
種々のインデックス結合メソッドやほかのアクセスメソッドの選択に関しては、選択肢のコスト予想によります。