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

MySQL 瘦身實戰:5 大維度壓縮磁盤佔用,單表省 18GB 不是夢

     編輯:MySQL 綜合教學

MySQL 瘦身實戰:5 大維度壓縮磁盤佔用,單表省 18GB 不是夢

TPS/QPS 不高但磁盤暴漲?單實例過大拖垮備份、內存、網絡?本文從表結構、存儲內容、數據保留、維護操作、壓縮表五大維度,給出可落地的瘦身建議,附實戰案例試算:5 億行表字段從 100 字節降到 60 字節,單表省 18GB+。

一、表結構設計:發揚「斤斤計較」精神

  1. 字符集最小化:能用 latin1 不用 gbk,能用 gbk 不用 utf8(或統一 utf8mb4 但控制列長度)。
  2. 索引濫用清理:未使用的索引、低選擇性索引(如性別/狀態均勻分布)、重複索引(主鍵+唯一鍵重複、前綴索引包含關係)堅決刪除。
  3. 冗餘字段清理:業務已廢棄或可通過 Join 獲取的冗餘列定期下線。
  4. 類型精準選擇:枚舉/狀態用 TINYINT 代替 CHAR(20),省 19 字節/行;IP 用 INT UNSIGNED 存 INET_ATON() 結果。
  5. 主鍵選擇:優先自增整型,避免長字符串/組合主鍵導致二級索引膨脹。

實戰反面教材

CREATE TABLE class_meta (
  class_name VARCHAR(128) NOT NULL,
  class_desc VARCHAR(2048) DEFAULT '',
  class_status CHAR(20) DEFAULT 'test1',
  PRIMARY KEY (class_name),
  UNIQUE KEY cm_cn_uk (class_name),          -- 與主鍵重複
  KEY cm_cd_ind (class_desc(767)),           -- 描述類字段不宜建索引
  KEY cm_cs_ind (class_status),              -- 低基數字段索引無效
  KEY cm_cdcn_ind (class_desc(767),class_name) -- 與 cm_cd_ind 重複
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

問題:主鍵+唯一鍵重複、描述字段建索引、低基數狀態建索引、前綴索引重複、主鍵非自增、狀態字段類型浪費。

二、存儲內容:大對象出表

  • 圖片、視頻、音頻、大文本**絕不**存庫,只存對象存儲路徑/URL。
  • 若必須存,使用 COMPRESSED 行格式或外部存儲 (LOB)。

三、數據保留:過期即清

  • 制定數據生命週期策略:熱數據留線上,溫數據歸檔分區表/歷史庫,冷數據導出冷存/刪除。
  • 利用分區表 DROP PARTITION 秒級清理歷史數據,避免 DELETE 產生碎片。

四、後期維護:定期整理碎片

  • 高頻 DELETE/UPDATE 表產生碎片,定期 OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 重建。
  • 配合 innodb_file_per_table=ON,重建後磁盤空間可回收 OS。

五、壓縮表:性能換空間的利器

  • 適用場景:唯讀/低寫入、CPU 有富餘、I/O 為瓶頸的表(如日誌、審計、歷史明細)。
  • 創建:CREATE TABLE t (...) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
  • 典型壓縮率 30%-70%,5 億行表實測可省 50%+ 空間。
  • 代價:CPU 開銷增加 ~10-20%,寫入延遲略升,讀取通常因 I/O 減少而加快。

試算:5 億行表省多少?

假設原行長 100 字節(含開銷),優化至 60 字節:

節省 = (100 - 60) * 5億 / 1024^3 ≈ 18.6 GB

若再啟用壓縮(率 50%),總節省可超 40 GB。這還不含二級索引縮減帶來的額外收益。

總結清單

「大處着眼,小處着手」,每個字節的較真,在 TB/PB 級都是真金白銀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度動作收益
結構精準類型、刪冗餘索引、自增主鍵高
大對象出表存路徑極高
保留分區+歸檔+刪除持續
維護定期 OPTIMIZE中
壓縮低寫表啟用 COMPRESSED高