MySQL 5.1 リファレンスマニュアル :: 6 最適化 :: 6.2 SELECTステートメントおよびその他のクエリの最適化 :: 6.2.6 インデックス結合最適化
« 6.2.5.2 複合パートインデックスのためのレンジアクセスメソッド

6.2.6.1 インデックス結合共通集合アルゴリズム »
Section Navigation      [Toggle]
  • 6.2 SELECTステートメントおよびその他のクエリの最適化
  • 6.2.1 EXPLAINを使用して、クエリを最適化する
  • 6.2.2 クエリパフォーマンスの推定
  • 6.2.3 SELECTクエリの速度
  • 6.2.4 WHERE 節最適化
  • 6.2.5 Range 最適化
  • 6.2.6 インデックス結合最適化
    • 6.2.6.1 インデックス結合共通集合アルゴリズム
    • 6.2.6.2 インデックス結合ユニオンアクセスアルゴリズム
    • 6.2.6.3 インデックス結合ソートユニオンアクセスアルゴリズム
  • 6.2.7 IS NULL最適化
  • 6.2.8 DISTINCT最適化
  • 6.2.9 LEFT JOINとRIGHT JOIN最適化
  • 6.2.10 入れ子結合最適化
  • 6.2.11 外側Join 単純化
  • 6.2.12 ORDER BY最適化
  • 6.2.13 GROUP BY最適化
  • 6.2.14 LIMITの最適化
  • 6.2.15 テーブルスキャンを避ける方法
  • 6.2.16 INSERTステートメントの速度
  • 6.2.17 UPDATEステートメントの速度
  • 6.2.18 DELETEステートメントの速度
  • 6.2.19 その他の最適化のヒント

6.2.6. インデックス結合最適化

[+/-]

6.2.6.1. インデックス結合共通集合アルゴリズム
6.2.6.2. インデックス結合ユニオンアクセスアルゴリズム
6.2.6.3. インデックス結合ソートユニオンアクセスアルゴリズム

Index Mergeメソッドは、複数のrangeスキャンを有する行を取得と、それぞれの結果を1つに結合するのにするのに使用されます。この結合によって、基礎スキャンの結合、共通集合、あるいは交差点の結合が生成されます。

EXPLAIN出力では、インデックスメソッドはtype カラムでindex_mergeとして現れます。この場合、keyカラムは使用されたインデックスのリストが含まれ、key_lenはインデックスの最長キー部分が含まれます。

例:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name
  WHERE (key1 = 10 OR key2 = 20) AND non_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 AND y) OR z = (x OR z) AND (y OR z)
    (x OR y) AND z = (x AND z) OR (y AND z)
    
  • インデックス結合は、フルテキストインデックスには適用されません。将来的にリリースされるMySQLのバージョンでカバーできるよう、拡張する予定です。

種々のインデックス結合メソッドや他のアクセスメソッドの選択に関しては、選択肢のコスト予想によります。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates