InnoDB 存儲長列(BLOB/TEXT/VARCHAR>255)會觸發 Off-page 機制:溢出資料獨佔獨立頁面,聚集索引僅存 20 字節指標,導致空間浪費與 I/O 惡化。本文深度解析存儲格式並給出五大優化策略。
innodb_page_size,不建議改)。COMPACT(預設,省 20%)、REDUNDANT、DYNAMIC、COMPRESSED(壓縮 50% 但 TPS 掉 90%,強烈不推薦,改用 TokuDB)。將所有長內容 JSON 序列化 + 壓縮(gzip/zstd)存入單一 BLOB 列,僅觸發 1 次 Off-page。
實際長度 ≤ 255 的列改為 VARCHAR(n) 或 CHAR(n)(定長用 CHAR),避免 Off-page。
按長度分組拆分多個子表,使每表總行長 < 8KB,減少 Off-page 頻率。示例:64KB 資料拆 5 子表,總空間最接近原始大小。
實際存 100 字節,定義 VARCHAR(255) 與 VARCHAR(100) 佔用空間相同,但 255 利於建前綴索引。
大量 BLOB 寫入場景(遊戲存檔、審計日誌)必須套用上述策略。

-- 子表 1:行長 7533 字節 CREATE TABLE t_longcol_51 (id INT AUTO_INCREMENT PRIMARY KEY, longcol1 VARCHAR(255), ..., longcol15 VARCHAR(3082)) ENGINE=InnoDB; -- 子表 2:行長 7168 字節 CREATE TABLE t_longcol_52 (id INT AUTO_INCREMENT PRIMARY KEY, longcol13 VARCHAR(1024), longcol14 VARCHAR(2048), longcol16 VARCHAR(4096)) ENGINE=InnoDB; ...(略)
掌握 Off-page 機制,長列存儲不再是黑盒。