行記錄格式
為織金等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及織金網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、做網(wǎng)站、織金網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
可以通過show table status like 'table_name'命令查看當(dāng)前表使用的行格式(row_format字段)
row_format
redundant,最早的行格式
記錄頭信息:占用6字節(jié),含義如圖:
最后部分即為實際存儲的每個列的數(shù)據(jù)
注意:對于varchar類型的NULL值,不占用任何存儲空間,而char類型的NULL值需要占用空間
compact,5.0.3以后默認(rèn)行格式
首部是一個非NULL變長字段長度列表,且按照列的順序逆序放置,其長度為(若列的長度小于255字節(jié),用1字節(jié)表示;若大于255個字節(jié),用2字節(jié)表示)
NULL標(biāo)志位:該行數(shù)據(jù)是否有NULL值,有則用1表示,占用1個字節(jié)
記錄頭信息:固定占用5字節(jié),含義如圖:
最后的部分為實際存儲每個列的數(shù)據(jù)(注:1.不管是char類型還是varchar類型,NULL不占該部分任何空間,只占有NULL標(biāo)志位;2.固定長度char字段在未能完全占用其長度空間時,會用Ox20來進(jìn)行填充)
每行數(shù)據(jù)除了用戶定義的列外,還有兩個隱藏列(事務(wù)ID(DB_TRX_ID)6字節(jié),回滾指針列(DB_ROLL_PTR),7字節(jié)),若沒有定義主鍵,還會增加一個rowid(DB_ROW_ID)6字節(jié)
Antelope文件格式包括compact和Redundant行記錄格式
Barracuda文件格式包括dynamic和compressed行記錄格式
行溢出數(shù)據(jù)
compact和redundant存放BLOB的行溢出數(shù)據(jù)存儲格式如圖:
varchar(N)中N指的是字符的長度,而文檔說明中varchar類型最大支持65535單位是字節(jié)且指的是所有varchar列的長度總和。
dynamic和compressed存放在BLOB中的數(shù)據(jù)采用的行溢出方式如圖:
行溢出總結(jié):
1.行記錄長度大約超過page一半時,依次將最長的列拆分發(fā)到多個page存儲,直到不再超過page的一半為止;
2.溢出的列放在一個page中不夠的話,繼續(xù)放在新的page中
3.compact格式下,溢出的列只存儲前768字節(jié)
4.dynamic格式下,溢出的列只存儲前20字節(jié)(指針)
5.select * 會同時讀取這些溢出的列,代價很高
6.執(zhí)行計劃中出現(xiàn)filesort或temporary table時,一般都無法放在內(nèi)存中,需要變成disk tmp table,IO代價更高。
dynamic,將長字段完全off-page存儲
compressed(存儲的行數(shù)據(jù)會以zlib算法進(jìn)行壓縮)將data、index、pages進(jìn)行壓縮,但buffer pool中的pages則不壓縮
CHAR行結(jié)構(gòu)存儲
char(N)中N是指字符的長度,所以在不同的字符集下,char類型列內(nèi)部存儲的可能不是定長的數(shù)據(jù)。