where显示null行_Python 之 MySql“未解之谜”14-- 都是 NULL 惹的祸(下)
最近在網上看到 MySql
關于 NULL 的文章
有幾個值得爭議的觀點,我們一起看看
● 準備工作
MySql 版本 5.7,InnoDB 存儲引擎,
表 test 數據量 10 w,
其中 a ,b,c 都是單列索引,都可以為 NULL,
a 列中 99 % 為 NULL,b 列中 10 % 為 NULL ,c 列中 90 % 為 NULL
● sql 語句樣例
其中 a 可換成 b 或者 c
● 網友觀點
觀點 1 :當 where 條件中出現 IS NULL 或者 IS NOT NULL,索引失效
觀點 2 :含有 NULL 的列不能創建索引,B + 樹不能存儲 NULL 值
● 通過 explain 命令分析
a 列中 99 % 為 NULL,b 列中 10 % 為 NULL ,c 列中 90 % 為 NULL
表1
從上述 sql 測試結果看:
● 當 where 條件中出現 IS NULL 或者 IS NOT NULL,索引失效。這句話是不正確。
關于索引是否存儲 NULL 值?
● 反方:索引不存儲 NULL值。
① 從表 1 中,當執行 explain 序號 1 時,使用了索引。在 表中存在大量 NULL 的情況下,去索引查詢,然后再回表查詢(一條條),效率還不如全表掃描(加載一個塊)。
② 從表 1 中,當執行 explain 序號 3 或者 4 時,如果索引存儲 NULL值,那么explain Extra 信息應該是 Using index,而實際情況是Using where;Using index,說明需要回表查詢。
● 正方:索引存儲 NULL 值。
如果 NULL 值不存儲在索引樹中,為什么會在 where IS NULL 條件下會去走索引,走索引說明定位到了為 NULL的值,至于反方所說的第二點,為什么明明是覆蓋索引,Extra 不顯示 Using index 的問題,因 NULL 是一種特殊的值,在索引樹中是經過復雜計算的,需要回表查詢。
>>>Python 之 MySql“未解之謎”13--都是 NULL 惹的禍(上)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的where显示null行_Python 之 MySql“未解之谜”14-- 都是 NULL 惹的祸(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows中彻底删除文件的正确操作是
- 下一篇: 现金折扣计算