1. 程式人生 > >MySQL查詢優化之IS NULL的優化

MySQL查詢優化之IS NULL的優化

原文地址:https://dev.mysql.com/doc/refman/5.7/en/is-null-optimization.html

譯文:

8.2.1.13 IS NULL 優化

MySQL可以對col_name IS NULL執行與col_name = constant_value相同的優化。例如,MySQL可以使用索引和範圍搜尋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的條件,且col_name列宣告為非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);

PS:由於水平有限,譯文中難免存在錯誤,歡迎批評指正。