InnoDB-表相關

索引組織表

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的行記錄方式。目的是爲了兼容之前版本頁的頁格式,格式如下:
在這裏插入圖片描述

行溢出數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章