Como o MariaDB Otimiza IS NULL
O MariaDB pode fazer a mesma otimização em column IS NULL
que ele pode com column = constant_value
. Por exemplos, o MariaDB 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 MariaDB 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 MariaDB 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
.