top
Loading...
7.2.7.MySQL如何優化ISNULL
7.2.7. MySQL如何優化IS NULL

MySQL可以對可以結合col_name = constant_value使用的col_name IS NULL進行相同的優化。例如,MySQL可以使用索引和范圍用IS NULL搜索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子句包括聲明為NOT NULL的列的col_name IS NULL條件,表達式則優化。當列會產生NULL時,不會進行優化;例如,如果來自LEFT JOIN右側的表。

MySQL也可以優化組合col_name = expr AND col_name IS NULL,這是解決子查詢的一種常用形式。當使用優化時EXPLAIN顯示ref_or_null

該優化可以為任何關鍵元素處理IS NULL

下面是一些優化的查詢例子,假定表t2的列ab有一個索引:

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);
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗