MySQL InnoDB 是怎麼使用 B+ 樹存數據的?

這裏限定 MySQL InnoDB 存儲引擎來進行闡述,避免不必要的閱讀歧義。

首先通過一篇文章簡要了解下 B 樹的相關知識:你好,我是B樹

B+ 樹是在 B 樹基礎上的變種,主要區別包括:

  • 1、所有數據都存儲在葉節點,其它幾點作爲索引存儲。

  • 2、數據節點添加鏈指針,便於橫向檢索。

數據是怎麼檢索的?

從根節點作爲起始檢索點,逐層向下檢索,直至找到目標數據。檢索的路徑複雜度度跟樹的高度成正比。

如上第一點,B+ 樹所有數據存儲於葉子節點,那麼路徑上就可以存儲更多的索引指針數據,進而使得數據的高度降低。能夠極大的提升檢索效率。

InnoDB 數據文件空間管理

image

Tablespaces -> Segments -> Extends -> Pages 級聯。

Page <-> Row

Page 是 MySQL 最小的存儲管理單元,默認的大小爲 16KB。最大行數據需要稍微小於 Page 大小的 1/2,超過的化作額外存儲處理。

Page <-> B+ 樹

MySQL InnoDB 表會使用一種特殊的索引聚簇索引來存儲行數據,索引中會包含主鍵數據。

索引的底層數據結果爲 B+ 樹(其它特殊此處不做贅述)。

如下圖:

image

一個節點對應一個 Page,MySQL 每次讀取的基本操作單元。

B+ 樹的高度與表數據存儲量大小

I:索引節點,每個節點可存儲的指針數。

H:樹的高度。

R:葉節點,每個節點可以存儲的記錄數。

一張表可以存儲的記錄數:N = pow(I, H - 1) * R。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章