O MySQL pode fazer a mesma otimização em column IS
NULL
que ele pode com column =
constant_value
. Por exemplos, o MySQL pode usar
índices e faixas para buscar por NULL
com
IS NULL
.
SELECT * FROM table_name WHERE key_col IS NULL; SELECT * FROM table_name WHERE key_col <=> NULL; SELECT * FROM table_name WHERE key_col=# OR key_col=# OR key_col IS NULL
Se você usa column_name IS NULL
em um
NOT NULL
em uma cláusula WHERE na tabela que
não é usada no OUTER JOIN
, esta espressão
será otimizada de qualquer forma.
O MySQL 4.1. pode adicionalmente otimizar a combinação
column = expr AND column IS NULL
, uma forma
que é comum em sub queries resolvidas.
EXPLAIN
mostrará
ref_or_null
quando esta otimização é
usada.
Esta otimização pode tratar um IS NULL
para
qualquer parte da chave.
Alguns exemplos de consultas que são otimizadas (assumindo chave em 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
funciona fazendo primeiro uma
leitura na chave indicada e depois disto uma busca separada por
linhas com chave NULL.
Note que a otimização só pode tratar um nível IS
NULL
.
SELECT * FROM t1,t2 where (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);
No caso acima o MySQL só usará busca de chave na parte
(t1.a=t2.a AND t2.a IS NULL)
e não poderá
usar a parte da chave em b
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.