MySQL 9.0 發行說明
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
子句包含針對宣告為 NOT NULL
的欄位的 col_name
IS NULL
條件,則該表達式會被最佳化掉。當欄位可能產生 NULL
時(例如,如果它來自 LEFT JOIN
右側的資料表),則不會發生此最佳化。
MySQL 也可以最佳化組合
,這是已解析子查詢中常見的形式。col_name
= expr
OR col_name
IS NULLEXPLAIN
在使用此最佳化時會顯示 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);