InnoDB 文件格式決定了行存儲方式、壓縮能力、索引結構。Antelope (舊格式) 僅支援 Compact/Redundant 行格式;Barracuda (Plugin/5.5+ 格式) 引入 Dynamic/Compressed 行格式,支援溢出頁只存 20 字節前綴、頁面級壓縮。本文詳細對比兩大格式特性、啟用條件、實測壓縮效果與避坑指南。
| 特性 | Antelope (InnoDB Base) | Barracuda (InnoDB Plugin/5.5+) |
|---|---|---|
| 支援行格式 | COMPACT, REDUNDANT | DYNAMIC, COMPRESSED |
| 變長列存儲 | <=768 bytes 內聯,超出溢出頁 | 只存 20 bytes 前綴,其餘溢出頁 |
| 頁面壓縮 | ✗ | ✓ (Compressed 行格式 + KEY_BLOCK_SIZE) |
| 索引前綴長度 | 767 bytes (utf8mb4 191 字符) | 3072 bytes (可配置) |
| 檔案格式標識 | .ibd 文件頭標記 Antelope | .ibd 文件頭標記 Barracuda |
| 前置條件 | 無 | innodb_file_per_table=ON + innodb_file_format=Barracuda |
ROW_FORMAT=COMPACT 時,變長列 ≤ 768 bytes 完全內聯,>768 bytes 首 768 bytes 內聯 + 指針指向溢出頁。導致大字段查詢需額外 I/O。KEY_BLOCK_SIZE 控制 (1/2/4/8/16 KB),寫入前壓縮,讀取時解壓。適合文本、JSON、日志類低更新高壓縮比表。環境:541 萬行單列整數表,對比三種建表方式:
-- t1: 指定 COMPRESSED 但未開啟 Barracuda (實際退化為 COMPACT) CREATE TABLE t1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; -- 警告: InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope -- 警告: InnoDB: assuming ROW_FORMAT=COMPACT -- t2: 默認格式 (Antelope + Compact) CREATE TABLE t2 (c1 INT PRIMARY KEY); -- t3: 正確啟用 Barracuda + Compressed SET GLOBAL innodb_file_per_table=1; SET GLOBAL innodb_file_format=Barracuda; CREATE TABLE t3 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
| 表 | .ibd 大小 | 實際行格式 | 壓縮率 |
|---|---|---|---|
| t1 (偽壓縮) | 136 MB | Compact | 0% |
| t2 (基準) | 136 MB | Compact | 0% |
| t3 (真壓縮) | 96 MB | Compressed | 29% |
關鍵發現:未設置 innodb_file_format=Barracuda 時,ROW_FORMAT=COMPRESSED 靜默失效退化為 Compact,**表結構顯示仍為 COMPRESSED 但實際未壓縮**,極具欺騙性。
innodb_file_per_table = ON (獨立表空間前提)。innodb_file_format = Barracuda (全局動態參數,即時生效)。ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8。SHOW TABLE STATUS WHERE Name='t3'\G → Row_format: Compressed。Innodb_compression_time、Innodb_compression_failed (壓縮失敗回滾計數)。KEY_BLOCK_SIZE 選擇:8KB 平衡壓縮率與 CPU;4KB 壓縮率高但碎片多;16KB 等同不壓縮。ALTER TABLE ... ROW_FORMAT=COMPRESSED 在線操作,但會重建表,大表需預留 2 倍磁盤空間。mysqldump 導出含 ROW_FORMAT 子句,還原自動復現;物理備份 (xtrabackup) 直接複製 .ibd 文件。Barracuda 格式通過 Dynamic 行格式 (20 bytes 前綴) 解決大字段污染緩存問題,通過 Compressed 行格式 (頁面壓縮) 實現 20-40% 空間節省。生產部署鐵律:**雙開關 (file_per_table + file_format) + 顯式 ROW_FORMAT + 事後驗證**,否則極易陷入「以為壓縮了實際沒壓縮」的靜默失效陷阱。