做者:洪斌
愛可生南區負責人兼技術服務總監,MySQL ACE,擅長數據庫架構規劃、故障診斷、性能優化分析,實踐經驗豐富,幫助各行業客戶解決 MySQL 技術問題,爲金融、運營商、互聯網等行業客戶提供 MySQL 總體解決方案。
本文來源:轉載自公衆號-玩轉MySQL
*愛可生開源社區出品,原創內容未經受權不得隨意使用,轉載請聯繫小編並註明來源。
前兩天有人問到如何計算索引高度,分享以前的一篇筆記。數據庫
InnoDB 表是 B+tree 索引結構,數據即索引。最小存儲單元爲 page,默認 16KB。性能優化
有兩類索引:架構
index page 由三種組合在一塊兒造成一個 B+Tree。性能
每一個 page 都有一個 level,leaf page 的 level 是 0,root page 的 level 取決於整個 B+Tree 的高度。優化
對於 leaf page,每條記錄包含一個 next-record 指針,記錄下一條記錄的偏移量。記錄按升序排列,但物理上並不是順序存放。infimum 和 supremum 是僞記錄,表明最小值和最大值。ui
non-leaf page 與 leaf page 結構相似,不一樣的是,每條記錄 key 存放指向子頁的最小值,value 部分存放子頁編號。spa
若是在同一個 level 下超過 1 個 page,page 間會使用雙向鏈表方式鏈接,每一個 page 的 FIL 頭存放指向 next page 和 prev page 的指針。3d
一個完整的索引樹結構:指針
觀察下 3 個表定義不一樣數據類型的主鍵,其數據頁中存儲記錄的狀況,每張表 90w 條記錄。blog
non-leaf page(level 1) 每頁有 1203 條記錄,每條記錄 13 byte(data/records)。
leaf page(level 0) 每頁有 73 條記錄,每條記錄 206 byte。
non-leaf page(level 1) 每頁有 928 條記錄,每條記錄 17 byte。
leaf page(level 0) 每頁有 72 條記錄,每條記錄 210 byte。
non-leaf page(level 1) 每一個頁可存儲 357 個記錄,每條記錄 45 byte。
leaf page(level 0) 每一個頁可存儲 63 個記錄,每條記錄 238 byte。
表 1:int 主鍵
表 2:bigint 主鍵
表 3:char(36) 主鍵
參考: https://blog.jcole.us/2013/05...