MySQL では、col_name
=
constant_value
.の場合と同じ最適化を
col_name
IS
NULL
に対しても実行できます。
たとえば、MySQL
では、インデックスと範囲を使用して、IS
NULL
で
NULL
を検索できます。
例:
SELECT * FROMtbl_name
WHEREkey_col
IS NULL; SELECT * FROMtbl_name
WHEREkey_col
<=> NULL; SELECT * FROMtbl_name
WHEREkey_col
=const1
ORkey_col
=const2
ORkey_col
IS NULL;
WHERE
節内でcol_name
IS
NULL
で定義されたものをNOT
NULL
と使用する場合、その式は消去して最適化されます。この最適化は、結果的にカラムがNULL
を生成する場合には生じません。たとえば、LEFT
JOIN
の右側のテーブルからきている場合。
MySQL は
の組み合わせを最適化する機能が追加されています。これは解決されたサブクエリではよくあるフォームです。この最適化が使用される場合は、col_name
=
expr
AND
col_name
IS
NULLEXPLAIN
は ref_or_null
を表示します。
この最適化は、すべてのキー部分で IS
NULL
を 1 つ処理できます。
最適されたクエリのサンプルをいくつか紹介します(t2
のキーを(a
,b
)とします)。
SELECT * FROM t1 WHERE t1.a=expr
OR t1.a IS NULL;
SELECT * FROM t1, t2 WHERE t1.a=t2.a OR t2.a IS NULL;
SELECT * FROM t1, t2
WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;
SELECT * FROM t1, t2
WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);
SELECT * FROM t1, t2
WHERE (t1.a=t2.a AND t2.a IS NULL AND ...)
OR (t1.a=t2.a AND t2.a IS NULL AND ...);
ref_or_null
はまずリファレンスキーの読み取りを行い、その後
NULL
キー値のあるレコードの別検索を実行します。
この最適化では、1 つの IS
NULL
レベルしか処理できないことに注意が必要です。
以下のクエリではMySQL は (t1.a=t2.a AND t2.a
IS
NULL)
の部分に対してキーのルックアップを実行するのみで、b
のキー部分は使用できません。
SELECT * FROM t1, t2 WHERE (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);