Spec-Zone.ru › MySQL 5.7

8.2.1.13 Оптимизация 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;

Если в предложении WHERE содержится условие col_name оператора IS NULL для столбца, объявленного как NOT NULL, это выражение оптимизируется. Данная оптимизация не происходит в случаях, когда столбец может привести к NULL (например, если он берется из таблицы в правой части 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 работает, сначала выполняя чтение по ключевому значению, а затем отдельный поиск строк с 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);

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/is-null-optimization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API