1.12 IS NULL Optimization 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的情況下,例如,如果該列的值來自一個左連接配接的右側的表。
mysql也能夠優化對于結合col_name=expr or col_name is null,該形式通常被解析為子查詢。當優化器被使用,那麼EXPLAIN展示ref_or_null。
優化器能夠處理任何關鍵字部分的is null。
一些會被優化的查詢的例子,假設在表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處理過程為首先對參考索引值進行讀取,然後在單獨對行中有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);
到此關于is null的優化就結束了,接下來我們要說明的是1.13ORDER BY Optimization(ORDER BY 的優化)