首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

InnoDB BLOB/TEXT 大欄位儲存效能優化:6 大原則與 5 種方案實測對比

     編輯:MySQL 綜合教學

InnoDB BLOB/TEXT 大欄位儲存效能優化:6 大原則與 5 種方案實測對比

InnoDB 儲存格式核心知識點

  1. 獨立表空間:啟用 innodb_file_per_table=ON,5.6+ 線上動態生效
  2. 頁面大小:預設 16KB,5.6+ 可調 innodb_page_size(不建議改)
  3. 預留空間:新資料寫入預留 1/16 空間,減少分裂
  4. 每頁至少 2 行:理論行長上限 8KB,實際更小(含內部結構)
  5. 填充率:順序寫入 15/16,隨機寫入 1/2~15/16 → **強烈建議自增主鍵**
  6. 收縮機制:填充率 < 1/2 觸發收縮釋放空間
  7. 行格式:COMPACT/REDUNDANT/DYNAMIC/COMPRESSED,預設 COMPACT
  8. COMPRESSED 省 50% 空間但 TPS 掉 90%,**強烈不推薦**,需壓縮請用 TokuDB
  9. Off-page 儲存:DYNAMIC/COMPRESSED 格式下,長欄位(BLOB/TEXT/長 VARCHAR)完整存放獨立頁面,聚簇索引只存 20 bytes 指標 → **I/O 效能差、空間浪費**
  10. Antelope + COMPACT/REDUNDANT:長欄位前 768 bytes 存聚簇索引頁,超出部分存額外頁面
  11. Off-page 頁面獨享:多長欄位 = 多獨享頁面 → **強烈不建議單表多長欄位**

優化建議 6 原則

  1. **序列化+壓縮後存單一欄位**,避免多次 off-page
  2. **實際長度 < 255 改 VARCHAR/CHAR**(定長用 CHAR)
  3. **拆分子表**:依最大長度組合,使每子表總行長 < 8KB,減少 off-page
  4. **頁面大小非預設時自行測試**找最佳值
  5. **VARCHAR(255) 實存 100 bytes 不佔額外空間**
  6. 遊戲領域常用 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、單表多長欄位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved