日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

case when影响性能吗_字段为NULL会影响查询性能吗?

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

  • 頁1 -> 頁3,在頁1中,發現2007-01-02大于2006-07-01,所以,箭頭流向指向頁3。
  • 頁3 -> 頁6,發現2007-01-02位于[2006-07-01,2007-06-07]之間,所以,箭頭流向指向頁6。
  • 由于頁6為葉子節點,而輔助索引B-Tree所有節點內的記錄按索引列升序排列,葉子節點之間是雙向鏈表,葉子節點內記錄組成單向鏈表,所以,發現頁6中第一條大于等于2007-01-02的記錄是<2007-06-06,6>,然后,從頁6中的<2007-06-06,6>后開始,順序遍歷<2007-06-06,6>和頁7的所有記錄。
  • 發現頁7最后一條記錄的age的值為2008-02-06,小于2008-08-02,因此,得到所有滿足[2007-01-02,2008-08-02]之間的記錄的主鍵6、8、2、5。
  • 最后根據主鍵6、8、2、5,到聚簇索引中查詢相應記錄即可,關于詳細查找過程,在這里我留一個懸念,在《IN字段查詢多少個值最合適》這一章節中我會詳細講解。
  • 小結

    通過上述內容的講解,我們知道了一張表中的一條記錄中的某個字段a,它的值為NULL值,同時,a字段加了索引,那么

  • a字段為NULL的記錄一定出現在輔助索引非葉或葉子節點的最左邊,采用深度遍歷查找這條記錄,效率是最高的。
  • 查找a字段不為NULL的記錄和NULL記錄的數量無關,通過輔助索引B-Tree的二分查找是能很快定位到記錄的。
  • 所以,表結構中存在默認值為NULL的字段,并不會影響查詢的性能。

    思考

    假設現在有這么兩條記錄,如下:

    INSERT

    如果現在我寫了這樣一條SQL:

    SELECT

    查找這兩條記錄的過程是怎么樣的?

    更多關于MySQL源碼的解讀內容,可以加vx群交流哦!或者知乎私信我,我都會回復的!

    https://weixin.qq.com/g/AQYAAMmWP-ei65ZsYYGNtPd1Xt4-_tIcJO8jlAYRhlN1U1T0YdxXejTWCvh5X2sE (二維碼自動識別)

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的case when影响性能吗_字段为NULL会影响查询性能吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。