為什麼索引無法使用is null和is not null
一般來說,表的索引都會建立在非空欄位。
當查詢時:
在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的過濾。
相關文章
- 為什麼typeof null→"object" ?NullObject
- 為什麼資料庫欄位要使用NOT NULL?資料庫Null
- IS NULL和IS NOT NULLNull
- NULL與索引Null索引
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- NULL列時,如何使得IS NULL或者IS NOT NULL可以使用索引來提高查詢效率Null索引
- 為什麼typeof null 的結果為 objectNullObject
- NULL 值與索引Null索引
- MySQL中is not null和!=null和<>null的區別MySqlNull
- 為什麼if中null要寫在前面?Null
- javascript中null是什麼JavaScriptNull
- 無法發貼,NULL錯誤,求助!Null
- NULL 值與索引(二)Null索引
- ((NULL) null).printNULL();((NULL) null).printnull();Null
- 索引與null(一):單列索引索引Null
- 索引與null(二):組合索引索引Null
- Object.create(null) 和 {} 區別是什麼ObjectNull
- 表為多列為null的表之索引示例Null索引
- 不再迷惑,無值和 NULL 值Null
- DB2 列為null,無法設定該列為主鍵DB2Null
- > /dev/null 2>&1 什麼意思?devNull
- 資料庫索引欄位請不要為NULL資料庫索引Null
- 索引失效系列——說說is null索引Null
- 返回的 json 串 sessionId 為什麼是 nullJSONSessionNull
- 別名的使用和nullNull
- /dev/null和標準*使用devNull
- 為什麼HashMap的鍵值可以為null,而ConcurrentHashMap不行?HashMapNull
- dart系列之:和null說再見,null使用最佳實踐DartNull
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的區別devNull
- mysql 查詢欄位為null或者非nullMySqlNull
- undefined和nullUndefinedNull
- null 和 undefinedNullUndefined
- 為什麼hashtable不允許設定Null但是hashmap允許?NullHashMap
- MySQL為何不建議使用null列MySqlNull
- not null與check is not nullNull
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- 你真的知道typeof null的結果為什麼是‘object‘嗎?NullObject