Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


8.2.1.9 LEFT JOIN および RIGHT JOIN の最適化

MySQL は次のように A LEFT JOIN B join_condition を実装します。

  • テーブル B は、テーブル AA が依存するすべてのテーブルに依存して設定されます。

  • テーブル A は、LEFT JOIN 条件で使用されるすべてのテーブル (B を除く) に依存して設定されます。

  • LEFT JOIN 条件は、テーブル B からの行の取得方法を決定するために使用されます。(言い換えると、WHERE 句内のすべての条件が使用されません)。

  • テーブルは常にそれが依存するすべてのテーブルのあとに読み取られることを除き、すべての標準の結合最適化が実行されます。循環依存関係がある場合、MySQL はエラーを発行します。

  • すべての標準 WHERE 最適化が実行されます。

  • AWHERE 句に一致する行があるが、BON 条件に一致する行がない場合、すべてのカラムが NULL に設定された追加の B 行が生成されます。

  • LEFT JOIN を使用して、一部のテーブルに存在しない行を検索し、WHERE 部分の col_name IS NULL のテストを実行した場合 (ここで col_nameNOT NULL と宣言されているカラム)、MySQL は LEFT JOIN 条件に一致する 1 つの行が見つかったあとに、それ以上の行 (の特定のキーの組み合わせ) の検索を停止します。

RIGHT JOIN の実装は、テーブルの役割が逆の LEFT JOIN の場合と類似しています。

結合オプティマイザは、テーブルを結合すべき順序を計算します。LEFT JOIN または STRAIGHT_JOIN によって強制されるテーブル読み取り順序は、確認するテーブル配列が少なくなるため、結合オプティマイザがはるかに高速にその作業を実行するのに役立ちます。これは、次のような種類のクエリーを実行する場合、LEFT JOIN によって d の前に b を読み取るように強制されるため、MySQL がその完全スキャンを実行することを意味します。

SELECT *
  FROM a JOIN b LEFT JOIN c ON (c.key=a.key)
  LEFT JOIN d ON (d.key=a.key)
  WHERE b.key=d.key;

この例の修正は、abFROM 句内に示される順序を逆にすることです。

SELECT *
  FROM b JOIN a LEFT JOIN c ON (c.key=a.key)
  LEFT JOIN d ON (d.key=a.key)
  WHERE b.key=d.key;

LEFT JOIN では、生成された NULL 行に対して、WHERE 条件が常に false である場合、LEFT JOIN は通常の結合に変更されます。たとえば、t2.column1NULL であった場合、次のクエリーの WHERE 句は false になります。

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

そのため、クエリーを通常の結合に変換しても問題ありません。

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

これにより、テーブル t1 の前にテーブル t2 を使用することがより適切なクエリー計画になる場合に、MySQL はそれを実行できるため、高速化できます。テーブルの結合順序についてヒントを提供するには、STRAIGHT_JOIN を使用します。(セクション13.2.9「SELECT 構文」を参照してください。)