一看就懂的MySQL的聚簇索引,以及聚簇索引是如何長高的

賜我白日夢發表於2021-05-25

這一篇筆記我們簡述一下

  • MySQL的B+Tree索引到底是咋回事?
  • 聚簇索引索引到底是如何長高的。

一點一點看,其實蠻好理解的。

如果你看過了我之前的筆記,你肯定知道了MySQL進行CRUD是在記憶體中進行的,也就是在Buffer Pool中。然後你也知道了當記憶體中沒有MySQL需要的資料時,MySQL會從Disk中通過IO操作將資料讀入記憶體中。讀取的單位呢就是:資料頁

一般資料頁長下面這樣

資料頁

沒錯,資料頁中儲存著真實的資料,而且資料頁在記憶體中是以雙向聯表的方式組織起來的!如下圖

頁分裂之前

而在B+Tree的設定中,它要求主鍵索引時遞增的,也就是說如果主鍵索引時遞增的話,那麼就要求右側的資料頁中的所有資料均比左側資料頁中的資料大。但是很明顯上圖並不符合,因此需要通過頁分裂來調整成下面這樣。

頁分裂之後

好,現在你回想一下,之前你肯定有聽說過:MySQL的B+Tree聚簇索引,只有葉子節點才儲存真實的資料,而非葉子節點中儲存的是索引資料,而且葉子節點之間是通過雙向連結串列連線起來

沒錯,那所有的B+Tree的葉子節點就是上圖中的資料頁,並且它們確實是通過雙向連結串列關聯起來的!

我們接著往下看,如果只看上圖由資料頁連線起來的雙向連結串列的話,這時如果我們檢索id=7的資料行,那會發生什麼?

很明顯我們要從頭開始掃描!

那你可能會問:方才不是說B+Tree要求主鍵是遞增的嘛?並且有頁分裂機制保證右邊的資料頁中的所有資料均比它左邊的資料頁的索引值大。那進行二分查詢不行嘛?

答:是的,確實可以在單個資料頁中進行二分查詢,但是資料頁之間的組織關係是連結串列呀,所以從頭開始遍歷是避免不了的。

那MySQL怎麼辦的呢?

如下圖:MySQL針對諸多的資料頁抽象出了一個索引目錄

那有了這個索引目錄我們再在諸多的資料頁中檢索時看起來就容易多了!直接就擁有了二分檢索的能力!

而且這個所以目錄其實也是存在於資料頁中的,不同於葉子節點的是,它裡面知識儲存了索引資訊,而葉子節點中儲存的是真實資料?

而索引頁的誕生也就意味著B+Tree的雛形已經誕生了!

隨著使用者不斷的select,buffer pool中的資料頁的越來越多,那麼索引頁中的資料也會水漲船高。當現有的索引體量超過16KB(一個資料頁的容量)時就不得不搞一個新的索引頁來儲存新的索引資訊。這時這顆B+Tree就會慢慢變得越來越胖。

那你也知道B+Tree是B樹的變種,而B樹其實可以是2-3樹、2-3-4數....等等M階樹的泛稱,當每個節點中能儲存的元素達到上限後,樹就會長高(上一篇文章有講過)。

就像下圖這樣:

推薦閱讀

  1. MySQL的修仙之路,圖文談談如何學MySQL、如何進階!(已釋出)
  2. 面前突擊!33道資料庫高頻面試題,你值得擁有!(已釋出)
  3. 大家常說的基數是什麼?(已釋出)
  4. 講講什麼是慢查!如何監控?如何排查?(已釋出)
  5. 對NotNull欄位插入Null值有啥現象?(已釋出)
  6. 能談談 date、datetime、time、timestamp、year的區別嗎?(已釋出)
  7. 瞭解資料庫的查詢快取和BufferPool嗎?談談看!(已釋出)
  8. 你知道資料庫緩衝池中的LRU-List嗎?(已釋出)
  9. 談談資料庫緩衝池中的Free-List?(已釋出)
  10. 談談資料庫緩衝池中的Flush-List?(已釋出)
  11. 瞭解髒頁刷回磁碟的時機嗎?(已釋出)
  12. 用十一張圖講清楚,當你CRUD時BufferPool中發生了什麼!以及BufferPool的優化!(已釋出)
  13. 聽說過表空間沒?什麼是表空間?什麼是資料表?(已釋出)
  14. 談談MySQL的:資料區、資料段、資料頁、資料頁究竟長什麼樣?瞭解資料頁分裂嗎?談談看!(已釋出)
  15. 談談MySQL的行記錄是什麼?長啥樣?(已釋出)
  16. 瞭解MySQL的行溢位機制嗎?(已釋出)
  17. 說說fsync這個系統呼叫吧! (已釋出)
  18. 簡述undo log、truncate、以及undo log如何幫你回滾事物! (已釋出)
  19. 我勸!這位年輕人不講MVCC,耗子尾汁! (已釋出)
  20. MySQL的崩潰恢復到底是怎麼回事? (已釋出)
  21. MySQL的binlog有啥用?誰寫的?在哪裡?怎麼配置 (已釋出)
  22. MySQL的bin log的寫入機制 (已釋出)
  23. 刪庫後!除了跑路還能幹什麼?(已釋出)
  24. 自導自演的面試現場,趣學資料庫的10種檔案(已釋出)
  25. 大型面試現場:一條update sql執行都經歷什麼?(已釋出)
  26. 大型翻車現場:如何實現記錄存在的話就更新,如果記錄不存在的話就插入。(已釋出)
  27. 視訊+圖文串講:MySQL 行鎖、間隙鎖、Next-Key-Lock、以及實現記錄存在的話就更新,如果記錄不存在的話就插入如何保證併發安全(已釋出)
  28. 自導自演的面試現場:說說char 和 varchar的區別你瞭解多少?。(已釋出)
  29. 自導自演的面試現場之--你竟然不瞭解MySQL的組提交?。(已釋出)
  30. 全網最清楚的:MySQL的insert buffer和change buffer 串講(已釋出)
  31. Double Write並不難理解
  32. 簡述MySQL的三大正規化

相關文章