MySQL的InnoDB存儲(chǔ)引擎支持哪幾種行格式?
數(shù)據(jù)庫表中的行格式?jīng)Q定了數(shù)據(jù)在物理存儲(chǔ)時(shí)的布局方式,進(jìn)而對(duì)查詢和DML操作的性能產(chǎn)生影響。
在InnoDB存儲(chǔ)引擎中,常見的行格式主要包括以下四種:
- COMPACT:在MySQL 5.0之前是默認(rèn)的格式,除了存儲(chǔ)字段值外,還會(huì)利用空值列表來保存null值,同時(shí)記錄變長(zhǎng)字段長(zhǎng)度列表和記錄頭信息。
圖片
COMPACT適用于處理大量包含可變長(zhǎng)度列(如VARCHAR、VARBINARY、BLOB和TEXT類型)數(shù)據(jù)。
對(duì)于可變長(zhǎng)度列,前768字節(jié)的數(shù)據(jù)存儲(chǔ)在B樹節(jié)點(diǎn)的索引記錄中,超出部分存儲(chǔ)在溢出頁中。大于或等于768字節(jié)的固定長(zhǎng)度列會(huì)被編碼為可變長(zhǎng)度列,可以存儲(chǔ)在頁外。
- REDUNDANT:在MySQL 5.0版本之前,InnoDB使用的行記錄存儲(chǔ)方式,較少使用。Redundant 行格式會(huì)將該記錄中所有列(包括隱藏列)的長(zhǎng)度信息存儲(chǔ)在“字段長(zhǎng)度偏移列表”中。
圖片
image.png
- DYNAMIC:MySQL 5.7版本引入的DYNAMIC格式是COMPACT格式的升級(jí)版本。它延續(xù)了COMPACT格式的優(yōu)勢(shì),在處理大型可變長(zhǎng)度列時(shí)更具靈活性,能夠靈活選擇將數(shù)據(jù)存儲(chǔ)在頁內(nèi)還是頁外。DYNAMIC格式適用于多數(shù)應(yīng)用場(chǎng)景,在存儲(chǔ)空間和性能之間取得了一定的平衡。其結(jié)構(gòu)與COMPACT格式大致相似;
- COMPRESSED:作為MySQL 5.1中InnoDB的新增特性之一,壓縮功能能夠減小數(shù)據(jù)在磁盤上的占用空間。然而,其缺點(diǎn)在于增加了CPU的負(fù)擔(dān),可能導(dǎo)致部分查詢性能下降。COMPRESSED行格式在DYNAMIC行格式的基礎(chǔ)上引入了頁外壓縮功能。在存儲(chǔ)數(shù)據(jù)時(shí),如果發(fā)現(xiàn)可以通過壓縮來減小存儲(chǔ)空間,系統(tǒng)將選擇壓縮方式來存儲(chǔ)數(shù)據(jù)。在查詢時(shí),數(shù)據(jù)將會(huì)被自動(dòng)解壓并返回結(jié)果。
- BARRACUDA:作為MySQL 5.7引進(jìn)的一種新格式,相較于前述格式,支持更多高級(jí)特性,包括動(dòng)態(tài)行格式、逐行壓縮以及空間管理等功能。
對(duì)比:
行格式 | 緊湊的存儲(chǔ)特性 | 增強(qiáng)的可變長(zhǎng)度列存儲(chǔ) | 大索引鍵前綴支持 | 壓縮支持 | 支持的表空間類型 | 所需文件格式 |
REDUNDANT | 否 | 否 | 否 | 否 | system, file-per-table, general | Antelope or Barracuda |
COMPACT | 是 | 否 | 否 | 否 | system, file-per-table, general | Antelope or Barracuda |
DYNAMIC | 是 | 是 | 是 | 否 | system, file-per-table, general | Barracuda |
COMPRESSED | 是 | 是 | 是 | 是 | file-per-table, general | Barracuda |