為什麼索引無法使用is null和is not null

guanhuazhan發表於2020-12-31

一般來說,表的索引都會建立在非空欄位。
當查詢時:
在where 語句種篩選 idx is null 時,由於索引欄位不為空,所以該條件失效,無法查詢;
在where 語句種篩選 idx is not null 時,由於索引欄位本身不為空,所以該條件也失效,會造成全表掃描;

對於使用LEFT JOIN和IS NULL來替換NOT IN,和使用LEFT JOIN和IS NULL來替換IN邏輯的情況下,縱使連線時使用的欄位為各表的索引欄位,依然可以對該索引欄位進行IS NULL和IS NOT NULL的過濾。
這是因為左連線之後進行的where篩選,實際上是在兩個表左連線之後的臨時表上進行的篩選,對於這個臨時表,只存在兩表的欄位組合,相應索引欄位也不再存在索引屬性,因此依然可以使用IS NULL和IS NOT NULL的過濾。

相關文章