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.

Retornar