您好,登錄后才能下訂單哦!
本篇內容主要講解“MYSQL中NULL走不走索引”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MYSQL中NULL走不走索引”吧!
首先的先標準化一些事情
1 數據表到底是哪種格式 (DYNAMIC)
2 此種格式的特點,以及NULL 在這樣存儲格式是怎么進行處理的
Dynamic 這種行的存儲格式有一些特點
1 所有的字符串的值大于 4 的都是動態的
2 每一行前都有一個位圖,位圖指示哪些列包含空字符串或零。如果字符串列在刪除尾隨空間后長度為零,或者數字列的值為零,則在位圖中標記它,而不是保存到磁盤。非空字符串保存為長度字節加上字符串內容。
3 空列需要行中額外的空間來記錄它們的值是否為空。
從上面的話,總結出來一句話,NULL 需要額外的空間來保存他,對比在你的字段里面'' 或者 0 來表明默認值,NULL 比他們更浪費空間。
在MYSQL5.7中NULL 是可以用\N
來代表NULL ,但在MYSQL 8 中被廢棄了,NULL 就是NULL 來代表。
這里有一個問題,提出NULL 不好,而要表設計中盡量不為空的依據是哪里來的。我們可以根據官方文檔中的一段話來說明。
其中有幾句,不使用NULL,可以
1 更好的使用INDEX
2 節省空間
3 加速SQL 的運行
OK,那我們就來做一下實驗,看看怎么來證明使用NULL 到底能不能走索引
從上圖來看,查詢空值是可以走索引的。那我們換只用寫法我們差 is not null
看上去的確是is not null是不能走索引,但實際上是這樣的嗎,是數量引起的全表掃描,還是is not null引起的問題?
下面的實驗證明 is not null也是可以走索引的,而is not null 無法走索引的情況和平時其他走不了索引的情況是一樣的,主要還是看cost 成本計算。
如果是OR 條件中 使用 is null or is null ,從下圖看是可以走索引的
按照索引的原理,二級索引的值是可以為NULL, 而索引的列值為NULL 的二級索引記錄來說,B+樹種的NULL 的值存在哪里,一般來說是B+樹的最左邊。
我們繼續進行測試,如果將部分條件和 is not null聯合進行查詢,從下圖看也是會走相關索引的。
所以上面的實驗證明了, is null , is not null 都是可以走相關的索引的,如果不走索引要不就是相關走INDEX 的成本比全表掃描還高,要不就是索引可能失效,或統計分析出了問題。
到此,相信大家對“MYSQL中NULL走不走索引”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。