InnoDB行格式對text/blob大變長字段的影響

1. InnoDB的Antelop與Barracuda文件格式

Innodb存儲引擎保存記錄,是以行的形式存放的(與之對應的是像Google BigTable這種列數據庫)。在InnoDB 1.0.x版本之前,InnoDB 存儲引擎提供了 CompactRedundant 兩種格式來存放行記錄數據,這也是目前使用最多的一種格式。Redundant 格式是爲兼容之前版本而保留的。

MySQL 5.1 中的 innodb_plugin 引入了新的文件格式Barracuda(將以前的行格式 compact 和 redundant 合稱爲Antelope),該文件格式擁有新的兩種行格式:compresseddynamic

在 MySQL 5.6 版本中,默認還是 Compact 行格式,也是目前使用最多的一種 ROW FORMAT。用戶可以通過命令 SHOW TABLE STATUS LIKE'table_name' 來查看當前表使用的行格式,其中 row_format 列表示當前所使用的行記錄結構類型。

 

2. 對TEXT/BLOB這類大字段類型的影響

2.1 compact

在 Antelope 兩種行格式下,如果blob列值長度 <= 768 bytes,就不會發生行溢出(page overflow),內容都在數據頁(B-tree Node);如果列值長度 > 768字節,那麼前768字節依然在數據頁,而剩餘的則放在溢出頁(off-page),上面所講的講的blob或變長大字段類型包括blob,text,varchar,其中varchar列值長度大於某數N時也會存溢出頁。innodb的塊大小默認爲16kb,由於innodb存儲引擎表爲索引組織表,樹底層的葉子節點爲一雙向鏈表,因此每個頁中至少應該有兩行記錄,這就決定了innodb在存儲一行數據的時候不能夠超過8k。

2.2 compressed或dynamic

Barracuda 的兩種行格式對blob採用完全行溢出,即聚集索引記錄(數據頁)只保留20字節的指針,指向真實存放它的溢出段地址:

dynamic,列存儲是否放到off-page頁,主要取決於行大小,它會把行中最長的那一列放到off-page,直到數據頁能存放下兩行。TEXT/BLOB列 <=40 bytes 時總是存放於數據頁。這種方式可以避免compact那樣把太多的大列值放到 B-tree Node,因爲dynamic格式認爲,只要大列值有部分數據放在off-page,那把整個值放入都放入off-page更有效。

compressed 物理結構上與dynamic類似,但是對錶的數據行使用zlib算法進行了壓縮存儲。在long blob列類型比較多的情況下用,可以降低off-page的使用,減少存儲空間(一般40%左右),但要求更高的CPU,buffer pool裏面可能會同時存儲數據的壓縮版和非壓縮版,所以也多佔用部分內存。

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