InnoDB BLOB/TEXT 大欄位儲存效能優化:6 大原則與 5 種方案實測對比
InnoDB 儲存格式核心知識點
- 獨立表空間:啟用
innodb_file_per_table=ON,5.6+ 線上動態生效
- 頁面大小:預設 16KB,5.6+ 可調
innodb_page_size(不建議改)
- 預留空間:新資料寫入預留 1/16 空間,減少分裂
- 每頁至少 2 行:理論行長上限 8KB,實際更小(含內部結構)
- 填充率:順序寫入 15/16,隨機寫入 1/2~15/16 → **強烈建議自增主鍵**
- 收縮機制:填充率 < 1/2 觸發收縮釋放空間
- 行格式:COMPACT/REDUNDANT/DYNAMIC/COMPRESSED,預設 COMPACT
- COMPRESSED 省 50% 空間但 TPS 掉 90%,**強烈不推薦**,需壓縮請用 TokuDB
- Off-page 儲存:DYNAMIC/COMPRESSED 格式下,長欄位(BLOB/TEXT/長 VARCHAR)完整存放獨立頁面,聚簇索引只存 20 bytes 指標 → **I/O 效能差、空間浪費**
- Antelope + COMPACT/REDUNDANT:長欄位前 768 bytes 存聚簇索引頁,超出部分存額外頁面
- Off-page 頁面獨享:多長欄位 = 多獨享頁面 → **強烈不建議單表多長欄位**
優化建議 6 原則
- **序列化+壓縮後存單一欄位**,避免多次 off-page
- **實際長度 < 255 改 VARCHAR/CHAR**(定長用 CHAR)
- **拆分子表**:依最大長度組合,使每子表總行長 < 8KB,減少 off-page
- **頁面大小非預設時自行測試**找最佳值
- **VARCHAR(255) 實存 100 bytes 不佔額外空間**
- 遊戲領域常用 BLOB,同業可關注
實測驗證:5 種儲存方案對比
場景:單表寫入 5,000 筆,每筆 64KB 資料,觀察表空間檔案大小。
| 方案 |
結構描述 |
預期 off-page 次數 |
| 表 0 |
1 個 BLOB 存全部 |
1 次 |
| 表 1 |
9 個 BLOB 平均分攤 |
9 次 |
| 表 2 |
20 個 BLOB 離散存儲 |
20 次 |
| 表 3 |
CHAR/VARCHAR/BLOB 混合 |
多次 |
| 表 4 |
全 VARCHAR/BLOB |
多次 |
| 表 5 |
VARCHAR(255) 實存 100 bytes |
多次 |
| 分表方案(表 51-55) |
5 子表,每表行長 < 8KB |
最少 |
實測結果(重整表空間後)

分表方案總大小:**507,904 bytes**,最接近理論最小值,其他方案均顯著更大。
結論
- InnoDB 處理大欄位機制決定:**單大欄位優於多小欄位**,**拆表使行長 < 8KB 最優**
- 實務上:序列化壓縮存單欄位最簡單;若需查詢部分欄位,按存取模式垂直拆表
- 避免
TEXT/BLOB、VARCHAR > 255、單表多長欄位