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 NULLEXPLAIN демонстрирует 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.