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