TPS/QPS 不高但磁盤暴漲?單實例過大拖垮備份、內存、網絡?本文從表結構、存儲內容、數據保留、維護操作、壓縮表五大維度,給出可落地的瘦身建議,附實戰案例試算:5 億行表字段從 100 字節降到 60 字節,單表省 18GB+。
latin1 不用 gbk,能用 gbk 不用 utf8(或統一 utf8mb4 但控制列長度)。TINYINT 代替 CHAR(20),省 19 字節/行;IP 用 INT UNSIGNED 存 INET_ATON() 結果。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;
問題:主鍵+唯一鍵重複、描述字段建索引、低基數狀態建索引、前綴索引重複、主鍵非自增、狀態字段類型浪費。
COMPRESSED 行格式或外部存儲 (LOB)。DROP PARTITION 秒級清理歷史數據,避免 DELETE 產生碎片。OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 重建。innodb_file_per_table=ON,重建後磁盤空間可回收 OS。CREATE TABLE t (...) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;假設原行長 100 字節(含開銷),優化至 60 字節:
節省 = (100 - 60) * 5億 / 1024^3 ≈ 18.6 GB
若再啟用壓縮(率 50%),總節省可超 40 GB。這還不含二級索引縮減帶來的額外收益。
| 維度 | 動作 | 收益 |
|---|---|---|
| 結構 | 精準類型、刪冗餘索引、自增主鍵 | 高 |
| 大對象 | 出表存路徑 | 極高 |
| 保留 | 分區+歸檔+刪除 | 持續 |
| 維護 | 定期 OPTIMIZE | 中 |
| 壓縮 | 低寫表啟用 COMPRESSED | 高 |