case when影响性能吗_字段为NULL会影响查询性能吗?
導讀
假設這個用戶中心系統是一個交友平臺的一個子系統,現在產品想要提供一個按生日區間篩選用戶的功能。那么,要實現這個功能,我們需要寫這么一條SQL:
SELECT為了保證這條SQL的查詢性能,我們會給用戶表中的birthday字段添加索引。乍一看最初的表結構設計,好像已經有一個索引index_age_birth,這個索引包含了birthday字段,是不是可以用這個現成的索引,不再另加索引?
對MySQL有一些基本了解的開發同學知道MySQL InnoDB的索引查找是按照最左前綴匹配原則的,即SQL中的Where條件中的字段,如果要命中索引,必須按照該索引列的順序逐一比對,最后定位查找結果。index_age_birth這個索引列的順序為,明顯age在前,birthday在后,所以,不滿足最左前綴匹配原則,無法命中該索引。
所以,現在我們必須給birthday這個字段單獨加上索引,見下圖:
ALTER這時,你可能想到birthday這個字段,我們設的默認值為NULL,隨之會產生一個疑問:如果某一個字段為NULL,以該字段作為條件進行查詢,是否會影響我們查詢的性能?今天這個章節,我們就先看看NULL這個值在InnoDB索引結構中是怎么存儲的,然后,結合上面這條select查詢SQL,看看MySQL又是如何執行這條SQL的,最后給到這個問題的答案。
存儲結構
由于之前的用戶表記錄中沒有birthday為NULL的記錄,為了講解NULL值對SQL查詢性能的影響,我先添加一條birthday為NULL的記錄,如下:
INSERT通過《基礎篇》中,我對InnoDB索引結構的講解,我們知道我加的這個index_birthday索引是一個輔助索引,所以,我們就來看一下NULL這個值在該輔助索引的結構是什么樣的,如下圖:
上圖就是一顆birthday字段為索引的B-Tree,輔助索引的B-Tree結構,我在《基礎篇》中詳細講解了,大家可以對照之前的講解看下這張圖,我在這里主要說一下NULL值的位置:NULL值被存儲到了該輔助索引B-Tree的非葉節點頁1、頁2和葉子節點頁4的最左邊。也就說NULL記錄總是出現在B-Tree的最左側。
那么,針對本章《導讀》中的這條select語句,MySQL又是如何查找索引的呢?為了方便瀏覽,我在這邊再貼一下這條SQL:
SELECT查找過程
在前面的章節,我講解過了MySQL查找輔助索引的整個過程,那么,結合這個例子,我再講解一下MySQL是如何在index_birthday這個索引中查找[2007-01-02,2008-08-02]之間的記錄的,見下圖:
如上圖,紅色箭頭部分,深度遍歷這顆B-Tree:
小結
通過上述內容的講解,我們知道了一張表中的一條記錄中的某個字段a,它的值為NULL值,同時,a字段加了索引,那么
所以,表結構中存在默認值為NULL的字段,并不會影響查詢的性能。
思考
假設現在有這么兩條記錄,如下:
INSERT如果現在我寫了這樣一條SQL:
SELECT查找這兩條記錄的過程是怎么樣的?
更多關于MySQL源碼的解讀內容,可以加vx群交流哦!或者知乎私信我,我都會回復的!
https://weixin.qq.com/g/AQYAAMmWP-ei65ZsYYGNtPd1Xt4-_tIcJO8jlAYRhlN1U1T0YdxXejTWCvh5X2sE (二維碼自動識別)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的case when影响性能吗_字段为NULL会影响查询性能吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 野蜂蜜的功效与作用、禁忌和食用方法
- 下一篇: 菠菜根的功效与作用、禁忌和食用方法
