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

