1. 程式人生 > >16.MySQL優化IS NULL

16.MySQL優化IS NULL

介紹

MySQL可以執行相同的優化col_name IS NULL和col_name = constant_value。例如,MySQL可以使用索引掃描和索引範圍掃描查詢NULL值, col_name 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;

假如一個列別定義為NOT NULL,而Where條件中這個列col_name IS NULL,則此表示式會被優化掉。假如列仍然可能產生NULL值的時候不會進行此優化,例如假如他是LEFT JOIN中右邊的表。

MySQL還可以優化組合col_name = expr OR col_name IS NULL,解析子查詢中的一種常見形式。

當這個優化被使用時EXPLAIN顯示ref_or_null

這個優化可以處理任何一個是IS NULL的關鍵部分。

下面是優化查詢的一些示例,假設a和t2的列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);