MySQL 資料庫的存儲結構 資料庫存儲結構 從小到大、行>頁 >區>段>表空間 (在Oracle中將頁稱為"塊") 頁是資料庫管理存儲空間的基本單位,即,資料庫I/O的最小單位是頁 InnoDB預設頁大小為16K,可以通過show variavles like '%innodb_page_size ...
MySQL 資料庫的存儲結構
資料庫存儲結構
- 從小到大、行>頁 >區>段>表空間 (在Oracle中將頁稱為"塊")
- 頁是資料庫管理存儲空間的基本單位,即,資料庫I/O的最小單位是頁
- InnoDB預設頁大小為16K,可以通過
show variavles like '%innodb_page_size%'
來查詢頁的大小。 - 一個區會分配64個連續的頁,因此InnoDB的一個區是 1M
- 段是資料庫的分配單位,且不要求段中的區與區必須連續。不同資料庫對象以不同的段形式存在,也就是說創建一個表時會創建一個表段,創建一個索引時會創建一個索引段。一個段只能屬於一個表空間。
- 表空間是一個邏輯容器,從管理上可以劃分為 系統表空間、用戶~、臨時~、撤銷~。InnoDB有兩種表空間類型:共用表空間和獨立表空間。使用
show variables like 'innodb_file_per_tble;'
如果查詢結果為ON,那麼說明每張表都會大單獨保存為一個.ibd文件
頁記憶體儲結構
借用陳暘老師的圖:
- 文件頭:數據頁之間形成雙相鏈表。頭文件中有兩個欄位---FILE_PAGE_PAGE和FILE_PAGE_NEXT。採用鏈表就使得數據頁之間不必是物理上的連續,而是邏輯上的連續。
- 文件尾:進行頁傳輸的時候可以將文件尾的檢驗和和文件頭的檢驗和對比來進行校驗。假如在傳輸頁的時候發生了斷電中斷,就會造成校驗和的不相等。
- 記錄部分:“最小和最大記錄”和“用戶記錄”占據頁的主要空間,“空閑空間”則是在新數據插入時,會在空閑空間開始存儲。
- 索引部分:頁目錄起到了索引的作用。因為在頁的節點中記錄是以單向鏈表的形式組織起來的,查詢效率不高,因此在因此在頁目錄中提供了二分查找的方式來加速查詢效率。
B+樹如何在數據頁上進行查詢
B+結構與存儲結構
- 在索引模型中我們說過索引可以分為聚集索引和非聚集索引,而每一個索引都相當於一棵B+樹,只是兩者的存儲內容不同。
- 在B+樹種每個節點都是一個頁,這也就是為什麼“每訪問一次節點就需要對磁碟進行一次I/O操作”。
- 每次新建節點的時候都會申請一個頁空間,而且同一層的節點之間會形成雙向鏈表(利用文件頭的雙向指針)
- 在節點內部,非葉子節點存儲的是索引鍵和指向下一層的指針,葉子節點存儲的是關鍵字(或許還有行記錄),節點內部的記錄之間是單向鏈表並使用頁目錄加速。
- 即,同層節點之間構成雙向鏈表,節點內記錄之間形成單向鏈表
檢索過程
- 從B+樹的根節點開始,逐層順著索引向下尋找目標關鍵字,找到關鍵字對應的節點後,就將該頁載入到記憶體中
- 然後利用頁目錄進行粗略的二分查找,再通過鏈表遍歷找到具體位置。
- (聚集索引的行記錄在物理上是連續的)