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
OR
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);