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.

