MySQL では、col_name
=
constant_value.の場合と同じ最適化を
col_name IS
NULLに対しても実行できます。
たとえば、MySQL
では、インデックスと範囲を使用して、IS
NULLで
NULLを検索できます。
例:
SELECT * FROMtbl_nameWHEREkey_colIS NULL; SELECT * FROMtbl_nameWHEREkey_col<=> NULL; SELECT * FROMtbl_nameWHEREkey_col=const1ORkey_col=const2ORkey_colIS 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);
