文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
手冊頁 (TGZ) - 258.2Kb
手冊頁 (Zip) - 365.3Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  IS NULL 最佳化

10.2.1.15 IS NULL 最佳化

MySQL 可以對 col_name IS NULL 執行與對 col_name = constant_value 相同的最佳化。例如,MySQL 可以使用索引和範圍來搜尋 NULLIS 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 OR 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);