技術分享 | InnoDB 的索引高度

做者:洪斌
愛可生南區負責人兼技術服務總監,MySQL  ACE,擅長數據庫架構規劃、故障診斷、性能優化分析,實踐經驗豐富,幫助各行業客戶解決 MySQL 技術問題,爲金融、運營商、互聯網等行業客戶提供 MySQL 總體解決方案。
本文來源:轉載自公衆號-玩轉MySQL
*愛可生開源社區出品,原創內容未經受權不得隨意使用,轉載請聯繫小編並註明來源。

前兩天有人問到如何計算索引高度,分享以前的一篇筆記。數據庫

InnoDB 表是 B+tree 索引結構,數據即索引。最小存儲單元爲 page,默認 16KB。性能優化

有兩類索引:架構

  • clustered index:主鍵或惟一索引爲 key,其餘字段值做爲 value。每張 InnoDB 表是一個 clustered index。
  • secondary index:指定字段爲 key,value 是 clustered index 的 key(即主鍵)。

index page 由三種組合在一塊兒造成一個 B+Tree。性能

  1. root page:在索引首次建立時分配,page id 保存在數據字典中,記錄保存指向子頁的指針。root page 填滿時不會發生分裂,而是將值移動到新的子頁上,並分裂成兩個。
  2. non-leaf page:存放指向 leaf page 或其餘 non-leaf page 的指針,也稱爲 internal page。
  3. leaf page:存放數據。

每一個 page 都有一個 level,leaf page 的 level 是 0,root page 的 level 取決於整個 B+Tree 的高度。優化

對於 leaf page,每條記錄包含一個 next-record 指針,記錄下一條記錄的偏移量。記錄按升序排列,但物理上並不是順序存放。infimum 和 supremum 是僞記錄,表明最小值和最大值。ui

1.jpg

non-leaf page 與 leaf page 結構相似,不一樣的是,每條記錄 key 存放指向子頁的最小值,value 部分存放子頁編號。spa

2.jpg

若是在同一個 level 下超過 1 個 page,page 間會使用雙向鏈表方式鏈接,每一個 page 的 FIL 頭存放指向 next page 和 prev page 的指針。3d

3.jpg

一個完整的索引樹結構:指針

4.jpg

觀察下 3 個表定義不一樣數據類型的主鍵,其數據頁中存儲記錄的狀況,每張表 90w 條記錄。blog

5.jpg

表 1:int 主鍵

non-leaf page(level 1) 每頁有 1203 條記錄,每條記錄 13 byte(data/records)。

6.jpg

leaf page(level 0) 每頁有 73 條記錄,每條記錄 206 byte。

7.jpg

表 2:bigint 主鍵

non-leaf page(level 1) 每頁有 928 條記錄,每條記錄 17 byte。

8.jpg

leaf page(level 0) 每頁有 72 條記錄,每條記錄 210 byte。

9.jpg

表 3:uuid 主鍵

non-leaf page(level 1) 每一個頁可存儲 357 個記錄,每條記錄 45 byte。

10.jpg

leaf page(level 0) 每一個頁可存儲 63 個記錄,每條記錄 238 byte。

11.jpg

12.jpg

索引樹高度估算

表 1:int 主鍵

13.jpg

表 2:bigint 主鍵

14.jpg

表 3:char(36) 主鍵

15.jpg

參考: https://blog.jcole.us/2013/05...
相關文章
相關標籤/搜索