mysql中InnoDB引擎中頁的概念

Innodb中頁的概念

基礎結構

Page是Innodb存儲的最基本結構,也是Innodb磁盤管理的最小單位,與數據庫相關的全部內容都存儲在Page結構裏。Page分爲幾種類型:數據頁(B-Tree Node)Undo頁(Undo Log Page)系統頁(System Page)事務數據頁(Transaction System Page)等;每一個數據頁的大小爲16kb,每一個Page使用一個32位(一位表示的就是0或1)的int值來表示,正好對應Innodb最大64TB的存儲容量(16kb * 2^32=64tib)
一個Page的基本結構以下:數據庫

clipboard.png

頭部數據

每一個page都有通用的頭和尾,可是中部的內容根據page的類型不一樣而發生變化,頭部的數據以下:優化

clipboard.png

page頭部保存了兩個指針,分別指向前一個Page和後一個Page,頭部還有Page的類型信息和用來惟一標識Page的編號。根據這個指針分佈能夠想象到Page連接起來就是一個雙向鏈表spa

clipboard.png

主體數據

在Page的主體部分,主要關注數據和索引的存儲,他們都位於User Records部分,User Records佔據Page的大部分空間,User Records由一條條的Record組成,每條記錄表明索引樹上的一個節點(非葉子節點和葉子節點);在一個單鏈表的內部,單鏈表的頭尾由兩條記錄來表示,字符串形式的「 Infimum」表明開頭,「Supremum」表示結尾;System Record 和 User Record是兩個平行的段;
Innodb中存在四種不一樣的Record,分別是3d

  1. 主鍵索引樹非葉子節點指針

  2. 主鍵索引樹葉子節點code

  3. 輔助鍵索引樹非葉子節點blog

  4. 輔助鍵索引樹葉子節點索引

這四種節點Record格式上有差別,可是內部都存儲着Next指針指向下一個Record事務

clipboard.png

User Record

User Record在Page內以單鏈表的形式存在,最初數據是按照插入的前後順序排列的,可是隨着新數據的插入和舊數據的刪除,數據物理順序發生改變,可是他們依然保持着邏輯上的前後順序ip

clipboard.png

把User Record組織形式和若干Page組織起來,就獲得了稍微完整的形式:

clipboard.png

如何定位一個Record:

  1. 經過根節點開始遍歷一個索引的B+樹,經過各層非葉子節點達到底層的葉子節點的數據頁(Page),這個Page內部存放的都是葉子節點

  2. 在Page內部從「Infimum」節點開始遍歷單鏈表(遍歷通常會被優化),若是找到鍵則返回。若是遍歷到了「Supremum」,說明當前Page裏沒有合適的鍵,這時藉助Page頁內部的next page指針,跳轉到下一個page繼續從「Infmum」開始逐個查找

clipboard.png

User Record內部的數據

User Record內部存儲了四種格式的數據:

  1. 主索引樹非葉子節點(綠色)

    • 子節點存儲的主鍵裏最小的值,這時B+樹必須的,做用是在一個Page裏定位到具體的記錄的位置

    • 最小的值所在的Page的編號,做用是定位到對應的Record所在的Page

  2. 主索引樹葉子節點(黃色)

    • 主鍵,B+樹所必須的,也是數據行的一部分

    • 除去主鍵之外的全部列,這時數據行的除去主鍵的其餘全部列的集合

  3. 輔助索引樹非葉子節點(藍色)

    • 子節點裏存儲的輔助鍵值裏的最小值,這時B+Tree必須的,做用是在一個Page裏定位到具體記錄的位置

  4. 輔助索引樹葉子節點(紅色)

    • 輔助索引鍵值,是B+樹必須的

    • 主鍵值,用來在主索引樹裏在作一次B+樹檢索來找到整條記錄

clipboard.png

總體的查找過程

clipboard.png

簡介的樹形查找示意圖

clipboard.png

Page和B+樹之間並無一一對應的關係,Page只是做爲一個Record的保存容器,它存在的目的是便於對磁盤空間進行批量管理。

相關文章
相關標籤/搜索