在早期的innodb版本中,由於檔案格式只有一種,但隨著innodb引擎的發展,開發出了相容早期版本的新檔案格式,用於支援新的功能,因此innodb開始使用命名的檔案格式
compact
變長字段列表
null標誌位
記錄頭資訊
column1資料
column2資料
額外資料
變長字段長度列表:如果定義長度小於128位元組或者小於256位元組且型別不是blob,那麼這個欄位的資料長度就用乙個位元組來儲存,除了上面兩種情況之外,都用兩個位元組來儲存;
null標識位:該位指示了該行資料中是否有null值,有則用1來標識;
記錄頭資訊:固定占用50位元組;
cloumnn資料:實際儲存每列的資料,null不佔該部分任何空間,即null占有null標誌位,實際儲存不佔任何空間
ps:每一行資料除了使用者定義的例外,還有兩個隱藏列,事務id列和回滾指標列,分別為6位元組和7位元組的大小,若innodb表沒有定義主鍵,每行還會增加乙個6位元組的rowid列
2、redundant(mysql5.0之前的行記錄格式)
字段便宜列表
記錄頭資訊
rowid
事務id
回滾指標
列1列2
列n欄位偏移列表:同樣是按照列的順序逆序放置的,若列的長度小於255位元組,用一位元組表示,若大於255位元組,用2位元組表示;
記錄頭資訊:占用6位元組
3、行溢位資料
當行記錄的長度沒有超過記錄最大長度時,所有資料都會 儲存在當前頁;
當行記錄的長度超過行記錄最大長度時,變長列會選擇外部溢位頁進行儲存;
對於compact和redundant,保留前768位元組在當前頁,其餘資料存放在溢位頁768位元組後面跟著20位元組的資料,用來儲存指向溢位頁的指標
4、對於compact和redundant行格式,innodb將變長字段(varchar varbinary blob text)的前786位元組儲存在b+樹節點中,其餘的資料存放在溢位頁,
5、compressed和dynamic
innodb1.0開始引入新的檔案格式,這個新的格式擁有兩種新的行記錄格式:compressed和dynamic,新的兩種記錄格式對於存放blob中的資料採用了完全的行溢位的方式:
dynamic行格式,列儲存是否放到off-page頁,主要取決於行大小,他會把行中最長的一列放到off-page中,直到資料頁能存放下兩行;
compressed物理結構上與dynamic類似,compressed行記錄格式的另乙個功能就是儲存在其中的行資料會議zlib的演算法進行壓縮,因此對於blob text varchar這類大長度資料能夠進行有效的儲存(減少40%,但對cpu要求更高)
mysql行格式 MySQL 行格式
以 mysql 預設的儲存引擎 innodb 為例 innodb 包含以下四種行格式 compact redundant dynamic compressed 指定行格式 create table 表名 列的資訊 row format 行格式名稱 alter table 表名 row format ...
innodb檔案格式
引數innodb file format定義了檔案格式 oracle建議使用barracuda,5.6預設是antelope是原本的檔案格式,支援compact和redundant行格式。主要是為了相容之前版本的複製配置。barracuda是最新的檔案格式,支援所有的行格式,包括compressed...
mysql 設定行格式 mysql行格式
最近用phpmyadmin,突然發現有個引數row format,以下是手冊中的解答部分,看了之後水平又提公升了,做個記錄。另外看了這部分之後發現原來mysql儲存變長資料的方法和檔案系統原來一樣啊,都是資料和索引分離,然後一堆碎片和鏈結,哈哈。紅色標出的部分比較重要,很少有人會去關注,提醒大家看下...