:: DEVELOPER ZONE
MySQL の A LEFT JOIN B join_condition は以下のように実装されます。
テーブル B はテーブル A と A が依存するすべてのテーブルに依存するように設定される。
テーブル A は、LEFT JOIN 条件で使用されるすべてのテーブル(B を除く)に依存するように設定される。
LEFT JOIN 条件は、テーブル B からのレコードの取り出し方法の判定に使用される(言い換えると、WHERE 節の条件はいずれも使用されない)。
あるテーブルが全てのテーブルの後に読み取られる場合を除き、通常の最適化全てが行われる。依存関係が循環している場合は、MySQL からエラーが出力される。
標準の WHERE 最適化すべてが実行される。
A に WHERE 節の条件にマッチするレコードがあり、B に ON 条件にマッチするレコードがない場合、B のカラムの値が NULL に設定されたレコードが生成される。
テーブルのいずれかに存在しないレコードを検索する際に LEFT JOIN を使用していて、かつ、WHERE 節内で、NOT NULL と定義した column_name を column_name IS NULL で評価した場合、
MySQL は LEFT JOIN 条件に一致するレコードを 1 つ検索すると、その後はレコードの検索(特定のキー組み合わせの)を停止する。
RIGHT JOIN の実装は LEFT JOIN と類似しています。
テーブル読み取り順序は LEFT JOIN と STRAIGHT JOIN によって強制されるため、チェック対象のテーブル順列が減少し、結合オプティマイザ(テーブルの結合順序を計算する)の動作の速度がさらに上がります。
上記は、該当する種類のクエリを実行した場合であることに注意してください。
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
LEFT JOIN が d の前に読み取るように強制するため、MySQL では b の完全スキャンが実行されます。
この状況はクエリを以下のように変更して修正します。
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
4.0.14 以降、MySQL では以下の LEFT JOIN 最適化が行われます。
生成された NULL レコードで WHERE 条件が常に false である場合、LEFT JOIN は通常の結合に変更されます。
たとえば、t2 カラムが NULL であるとすると、以下のクエリの WHERE 節は false になるため、通常の結合に変換しても問題ありません。
SELECT * FROM t1 LEFT t2 ON (column) WHERE t2.column2 =5; -> SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column=t2.column;
これでクエリが改善できる場合、MySQL がテーブル t1 を読み取る前にテーブル t2 を使用できるようになるためスピードが向上します。テーブルの順序を指定して強制する場合は STRAIGHT JOIN を使用します。
© 1995-2005 MySQL AB. All rights reserved.
