您好,登錄后才能下訂單哦!
行記錄格式
可以通過show table status like 'table_name'命令查看當前表使用的行格式(row_format字段)
row_format
redundant,最早的行格式
記錄頭信息:占用6字節,含義如圖:
最后部分即為實際存儲的每個列的數據
注意:對于varchar類型的NULL值,不占用任何存儲空間,而char類型的NULL值需要占用空間
compact,5.0.3以后默認行格式
首部是一個非NULL變長字段長度列表,且按照列的順序逆序放置,其長度為(若列的長度小于255字節,用1字節表示;若大于255個字節,用2字節表示)
NULL標志位:該行數據是否有NULL值,有則用1表示,占用1個字節
記錄頭信息:固定占用5字節,含義如圖:
最后的部分為實際存儲每個列的數據(注:1.不管是char類型還是varchar類型,NULL不占該部分任何空間,只占有NULL標志位;2.固定長度char字段在未能完全占用其長度空間時,會用Ox20來進行填充)
每行數據除了用戶定義的列外,還有兩個隱藏列(事務ID(DB_TRX_ID)6字節,回滾指針列(DB_ROLL_PTR),7字節),若沒有定義主鍵,還會增加一個rowid(DB_ROW_ID)6字節
Antelope文件格式包括compact和Redundant行記錄格式
Barracuda文件格式包括dynamic和compressed行記錄格式
行溢出數據
compact和redundant存放BLOB的行溢出數據存儲格式如圖:
varchar(N)中N指的是字符的長度,而文檔說明中varchar類型最大支持65535單位是字節且指的是所有varchar列的長度總和。
dynamic和compressed存放在BLOB中的數據采用的行溢出方式如圖:
行溢出總結:
1.行記錄長度大約超過page一半時,依次將最長的列拆分發到多個page存儲,直到不再超過page的一半為止;
2.溢出的列放在一個page中不夠的話,繼續放在新的page中
3.compact格式下,溢出的列只存儲前768字節
4.dynamic格式下,溢出的列只存儲前20字節(指針)
5.select * 會同時讀取這些溢出的列,代價很高
6.執行計劃中出現filesort或temporary table時,一般都無法放在內存中,需要變成disk tmp table,IO代價更高。
dynamic,將長字段完全off-page存儲
compressed(存儲的行數據會以zlib算法進行壓縮)將data、index、pages進行壓縮,但buffer pool中的pages則不壓縮
CHAR行結構存儲
char(N)中N是指字符的長度,所以在不同的字符集下,char類型列內部存儲的可能不是定長的數據。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。