索引組織表
InnoDB存儲引擎中,表都是按主鍵順序組織存放的,這種按主鍵方式存儲的表就叫做索引組織表。
在InnoDB的存儲引擎表中,每個表都有主鍵,如果創建表時沒定義主鍵,會按一下方式設定主鍵:
- 表中是否有非空的唯一索引,有則把第一個定義的定爲主鍵
- 如果都不符合則自動創建一個6字節大小的指針來作爲主鍵
InnoDB邏輯存儲結構
所有數據都被邏輯地存放在一個空間,這個空間被稱爲表空間:
表空間
存儲引擎邏輯結構的最高層
段
表空間由各個段組成,常見的段有數據段(B+樹的葉子節點),索引段(B+樹的非葉子節點),回滾段等
區
區是由連續頁組成的空間,每個區的大小爲1MB,一般InnoDB引擎一次從磁盤申請4-5個區,默認請款頁大小爲16KB,這時候一個區中有64個連續的頁。當頁大小改變是區的大小還是1MB
頁
頁時innoDB磁盤管理的最小單位。
頁的常見類型有:
- 數據頁(B+樹葉子節點)
- undo 頁(完整性用的)
- 系統頁
- 事務數據頁
- 插入緩衝bitmap頁
- 插入緩衝空閒list頁
- 未壓縮的二進制大對象頁
- 壓縮的二進制大對象頁
行
InnoDB中數據是按行來存放的,如果頁大小是16KB,每個頁最多允許存放16kb/2-200=7992行記錄。
1.2.x版本默認使用Compact行記錄格式來保存行:
- 變長字段長度列表:若列的長度小於255字節,大小爲1字節,否則大小爲2字節,表示的是對應變長列(比如vchar)的數據的實際大小,存儲順序是從後往前存。而固定長度類型(比如char)的列當實際長度小於設定長度時會用0x20來填充。
- NULL標誌位:大小爲1字節,bitmap標誌位,從低到高順序表示第n個bit對應的第n個列是否爲NULL,1表示爲NULL,(比如某一行有t1,t2,t3,t4 4個屬性,其中t2,t3 爲NULL,則NULL標誌位的值爲 00000110,即0x06,其中的1就是表示第二個,第3個屬性爲NULL)
- 記錄頭信息:固定5字節,含義如下圖:next_record的值就是下一個記錄的偏移量,這樣就把頁中的每一行弄成了鏈表的模式,每一行數據就是頁鏈表中的一個node。
- 實際存儲每個列的數據:NULL不佔用該部分的任何數據
- 隱藏列:每行數據除了用戶定義的列,還有兩個隱藏列,事務ID列表(6字節)和回滾指針列(7字節),如果沒有定義主鍵還會加一個6字節的rowid列
Redundant行記錄格式
MySQL5.0版本之前InnoDB的行記錄方式。目的是爲了兼容之前版本頁的頁格式,格式如下: