數據魔方業務:數據**一次寫入、極少更新**、海量歷史日志/報表。需壓縮降低存儲成本。對比兩種原生壓縮方案:
(partition_by1, idx_rank)、(partition_by1, chg_idx),partition_by1 VARCHAR(32) 為核心檢索鍵。mysqlslap 並發 50、迭代 10、7 條生產真實 SQL(含 WHERE partition_by1=?、ORDER BY added_quantity3 DESC LIMIT 500)。| 指標 | 基準表 (MyISAM) | Archive | MyISAM Pack |
|---|---|---|---|
| 磁盤空間 | 403,956,004 字節 | 75,630,745 字節 | 99,302,109 字節 |
| 壓縮率 | 100% (基準) | 18.7% | 24.6% |
| 查詢耗時 (50 並發) | 2.308 秒 | >300 秒 (殺掉) | 2.596 秒 |
| CPU Idle | 30% | 75% | 30% |
| Load | 15 | 4 | 22 |
| 實際並發 | 50 | 1 (串行) | 50 |
核心 SQL:
SELECT ... FROM t WHERE partition_by1 = '50008090' ORDER BY added_quantity3 DESC LIMIT 500
EXPLAIN 顯示 type=ref,用到 idx_partition_by1,**匹配 2,477 行**,再 filesort 排序。EXPLAIN 顯示 type=ALL,**全表掃描 2,424,753 行**,無索引可用,再 filesort。Archive **不允許建立除主鍵外的任何索引**,導致核心檢索列 partition_by1 無法走索引,**全表掃描 + 排序 = 災難性性能**。
| 維度 | Archive | MyISAM Pack |
|---|---|---|
| 寫入性能 | 極快(僅順序追加、壓縮) | 需先建表、導數據、再 myisampack、再 myisamchk -rq,不可更新 |
| 查詢性能 | 極差(全掃描) | 優秀(支援索引、覆蓋索引) |
| 空間壓縮率 | 最高(~15-20%) | 次之(~20-30%) |
| 更新/刪除 | 不支援 | 不支援(只讀) |
| 事務/崩潰恢復 | 不支援 | 不支援 |
| 適用業務 | 純歸檔、極少查詢、合規存證 | 歷史報表、數據倉庫、只讀分析、高頻點查/範圍查 |
MySQL 5.6+ InnoDB 支援 **頁面級壓縮** (ROW_FORMAT=COMPRESSED, KEY_BLOCK_SIZE=8/4/2):
ALTER TABLE t ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;結論:InnoDB 壓縮表是「可查詢、可更新、可事務、可壓縮」的最佳平衡點,新業務首選;Archive 僅限極少查詢的冷歸檔;MyISAM Pack 僅限遺留只讀系統維護。
壓縮雖能省空間,但**索引缺失帶來的查詢性能崩塌往往得不償失**。測試證實:Archive 空間省 80%,查詢慢 100 倍;MyISAM Pack 空間省 75%,查詢性能持平基準。**InnoDB 頁面壓縮**兼顧空間與性能,是現代 MySQL 壓縮的正解。選型時務必:**先定業務查詢模式,再選壓縮方案,最後實測驗證**——不要為省幾塊硬盤錢換來全表掃描的噩夢。