[MySQL]InnoDB行格式剖析
InnoDB和大多數行式數據庫一樣,記錄以行的格式存儲,它提供了兩種格式:Compact和Redundant
Compact
Compact格式是在MySQL5.0時才被引入,它是新的行格式,其設計目標是高效存放數據,示意圖如下:
1)變長字段長度列表。按列的逆序放置,當列長度小於255字節,用1字節表示,若大於255字節,用2個字節表示,至多為2字節(這也很好解釋了InnoDB中varchar的最大長度為什麼是65535,因為2個字節為16位,2的16次方-1)。注意,對於固定長度字段(如char),是不需要記錄其長度的。
2)NULL標志位。指示該行中的列是否為NULL,1表示NULL。
3)記錄頭信息。固定占用5個字節(40位),每位代表的含義如下表所示:
4)最後就是實際存儲的該行每列的數據了,注意:NULL不在該部分中占用存儲。
5)此外還有兩個隱藏部分,分別存放事務ID和回滾指針,大小分別為6字節和7字節,如果表沒有定義主鍵,每行還會自動增加6字節的ROWID。
Redundant
Redundant是MySQL5.0之前InnoDB的行記錄存儲格式,其示意圖如下:
1)字段長度偏移列表。同樣按列的逆序放置,當列長度小於255字節,用1字節表示,若大於255字節,用2個字節表示。
2)記錄頭信息。固定占用6個字節(48位),每位含義見下表:
3)最後部分是實際存儲各個列數據。
4)和Compact一樣,還有兩個隱藏部分,分別存放事務ID和回滾指針,大小分別為6字節和7字節,如果表沒有定義主鍵,每行還會自動增加6字節的ROWID。
Redundant和Compact最大的不同是對Char類型NULL值的處理,Redundant會實際存儲NULL值,占Char類型固定長度空間,而Compact不占用空間,這也是Compact能寸更多記錄的原因之一。注意:對於varchar類型,不管是Compact還是Redundant都不存儲NULL值。
Compressed和Dynamic
InnoDB Plugin引入了新的文件格式,稱為Barracuda(之前的Compact和Redundant稱為Antelope),擁有兩種權限的記錄格式Compressed和Dynamic。這裡就不詳細介紹它們了,有興趣的童鞋可以自行研究下。