Spec-Zone .ru
спецификации, руководства, описания, API

8.13.6. IS NULL Оптимизация

MySQL может выполнить ту же самую оптимизацию на col_name IS NULL то, что это может использовать для col_name = constant_value. Например, MySQL может использовать, индексирует и располагается, чтобы искать NULL с IS NULL.

Примеры:

SELECT * FROM tbl_name WHERE key_col IS NULL;SELECT * FROM tbl_name WHERE key_col <=> NULL;SELECT * FROM tbl_name  WHERE key_col=const1 OR key_col=const2 OR key_col IS NULL;

Если a WHERE пункт включает a col_name IS NULL условие для столбца, который объявляется как NOT NULL, то выражение оптимизируется далеко. Эта оптимизация не происходит в случаях, когда столбец мог бы произвести NULL так или иначе; например, если это прибывает из таблицы на правой стороне a LEFT JOIN.

MySQL может также оптимизировать комбинацию col_name = expr OR col_name IS NULL, форма, которая распространена в разрешенных подзапросах. EXPLAIN шоу ref_or_null когда эта оптимизация используется.

Эта оптимизация может обработать тот IS NULL для любой ключевой роли.

Некоторые примеры запросов, которые оптимизируются, предполагая, что есть индексирование на столбцах a и b из таблицы t2:

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 работы первым выполнением чтения на ссылочном ключе, и затем отдельного поиска строк с a NULL значение ключа.

Отметьте, что оптимизация может обработать только один 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);