這裏限定 MySQL InnoDB 存儲引擎來進行闡述,避免不必要的閱讀歧義。
首先通過一篇文章簡要了解下 B 樹的相關知識:你好,我是B樹 。
B+ 樹是在 B 樹基礎上的變種,主要區別包括:
-
1、所有數據都存儲在葉節點,其它幾點作爲索引存儲。
-
2、數據節點添加鏈指針,便於橫向檢索。
數據是怎麼檢索的?
從根節點作爲起始檢索點,逐層向下檢索,直至找到目標數據。檢索的路徑複雜度度跟樹的高度成正比。
如上第一點,B+ 樹所有數據存儲於葉子節點,那麼路徑上就可以存儲更多的索引指針數據,進而使得數據的高度降低。能夠極大的提升檢索效率。
InnoDB 數據文件空間管理
Tablespaces -> Segments -> Extends -> Pages 級聯。
Page <-> Row
Page 是 MySQL 最小的存儲管理單元,默認的大小爲 16KB。最大行數據需要稍微小於 Page 大小的 1/2,超過的化作額外存儲處理。
Page <-> B+ 樹
MySQL InnoDB 表會使用一種特殊的索引聚簇索引來存儲行數據,索引中會包含主鍵數據。
索引的底層數據結果爲 B+ 樹(其它特殊此處不做贅述)。
如下圖:
一個節點對應一個 Page,MySQL 每次讀取的基本操作單元。
B+ 樹的高度與表數據存儲量大小
I:索引節點,每個節點可存儲的指針數。
H:樹的高度。
R:葉節點,每個節點可以存儲的記錄數。
一張表可以存儲的記錄數:N = pow(I, H - 1) * R。