MySQL では、column = constant_value
の場合と同じ最適化を column IS NULL
に対しても実行できます。たとえば、MySQL
では、インデックスと範囲を使用して、IS
NULL
で NULL
を検索できます。
SELECT * FROM table_name WHERE key_col IS NULL; SELECT * FROM table_name WHERE key_col <=> NULL; SELECT * FROM table_name WHERE key_col=# OR key_col=# OR key_col IS NULL
OUTER JOIN
に使用されないテーブル上で、WHERE
節内で column_name IS NULL
で定義された物を NOT NULL
と使用する場合、その式は消去して最適化されます。
MySQL 4.1.1 では、column = expr AND column IS
NULL
の組み合わせを最適化する機能が追加されています。この最適化が使用される場合は、EXPLAIN
は 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
レベルしか処理できないことに注意が必要です。
SELECT * FROM t1,t2 where (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);
この状況で MySQL は (t1.a=t2.a AND t2.a IS
NULL)
の部分に対してキーのルックアップを実行するのみで、b
のキー部分は使用できません。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.