主要闡述InnoDB存儲引擎(MySQL5以後的預設引擎)。 資料庫中最基本的組成結構是數據表,視覺上的表和其對應的磁碟結構如下: 此圖參考了廈門大學課堂:MySQL原理 。但是視頻中一些更多細節沒有涉及,比如Leaf node segment和Non-leaf node segment其實就是葉子 ...
主要闡述InnoDB存儲引擎(MySQL5以後的預設引擎)。
資料庫中最基本的組成結構是數據表,視覺上的表和其對應的磁碟結構如下:
此圖參考了廈門大學課堂:MySQL原理 。但是視頻中一些更多細節沒有涉及,比如Leaf node segment和Non-leaf node segment其實就是葉子節點和非葉子節點段,
照inode,page相關概念,一顆B+樹當然只有這兩種段,來管理各種page(樹節點)。信息較少,且看且珍惜。
更多關於tablespace的信息移步:MySQL Tablespaces
**核心:MySQL以Page為單位進行數據管理(預設1個Page=16KB)。因為磁碟尋道原因,一次將讀取1個Page到記憶體。即每次查詢,一次IO至少是一個Page的數據被裝載到記憶體。
將segment,extent,page的關係描繪如下:
Page的組成:
**page directory:提高records部分的查詢速度(單鏈表-->排序-->二分查找)。定位到page後,records記錄太長,設計了page directory的slot插槽,每個slot包含一段records記錄,提高查找效率。
為什麼一個Page是16KB?太大,page directory定位時間太長;太小,磁碟尋道時間變長,IO次數變多。這是一個折中值。(固態硬碟沒有磁碟尋道,可以考慮將Page size的值改為小於16KB的更小的值,仍需要測試驗證數據支撐)。
索引頁:
MySQL中:每個索引都對應了一顆B+樹。
聚集(聚集不一定是主鍵,但主鍵一定是聚集)索引對應了一顆B+樹,葉子節點存儲了數據;
非聚集(輔助)索引對應了一顆B+樹,葉子節點只存儲了主鍵,所以需要額外一次去聚集索引B+樹查找所需數據(即回表)。
主鍵索引和輔助索引檢索示意:
本文中部分圖的來源在這裡。
作者:hangwei
出處:http://www.cnblogs.com/hangwei/
關於作者:專註於開源平臺,分散式系統的架構設計與開發、資料庫性能調優等工作。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
如果您覺得文章對您有幫助,可以點擊文章右下角“推薦”一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!