myisampack 是 MyISAM 存儲引擎專用的**只讀表壓縮工具**,將 .MYD 數據文件壓縮為 .MYI 索引可直接讀取的壓縮格式,典型壓縮比 40%-70%,極大節省存儲與 I/O,適配歸檔表、日志表、字典表等**寫一次讀多、不再修改**的場景。
# 1. 停止寫入,確保表靜態 mysql -e "FLUSH TABLES archive_logs WITH READ LOCK;" # 2. 壓縮(需表未被打開) myisampack -b /backup /var/lib/mysql/mydb/archive_logs # -b 備份原文件至指定目錄(強烈建議) # 3. 重建索引(必須步驟) myisamchk -rq /var/lib/mysql/mydb/archive_logs # 4. 釋放鎖 mysql -e "UNLOCK TABLES;" # 5. 驗證 mysql -e "SELECT COUNT(*) FROM mydb.archive_logs;" ls -lh /var/lib/mysql/mydb/archive_logs.*
| 參數 | 說明 |
|---|---|
-b, --backup | 備份原 .MYD 文件(壓縮前),防意外回滾 |
-f, --force | 強制壓縮,即使壓縮後文件更大 |
-v, --verbose | 顯示逐列壓縮統計 |
-t, --test | 僅測試不寫入,預估壓縮比 |
-j, --join | 合并多個同結構表為一個壓縮表 |
# 壓縮前 archive_logs.MYD 2.1G archive_logs.MYI 320M # 壓縮後 archive_logs.MYD 680M (壓縮比 67%) archive_logs.MYI 350M (索引微增) # 查詢性能:全表掃描 I/O 降低 60%+,緩存命中率顯著提升
| ✅ 適用 | ❌ 禁忌 |
|---|---|
| 歷史歸檔日志表(按月/年分表) | 活躍業務表(頻繁寫入) |
| 數據字典/配置表(極少變更) | 需支持事務的表(MyISAM 本身不支持) |
| 只讀報表/統計中間表 | 大字段表(BLOB/TEXT 壓縮效果差) |
| 數據倉庫維度表 | InnoDB 表(不支持,需先轉 MyISAM) |
COMPRESSION='zlib' / ROW_FORMAT=COMPRESSED。-- 建表指定壓縮 CREATE TABLE t (id INT PRIMARY KEY, data TEXT) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; -- 8KB 頁,默認 16KB -- 現有表轉壓縮(重建表,需鎖表/在線 DDL) ALTER TABLE t ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
InnoDB 頁壓縮透明支持讀寫,壓縮比略低(通常 30-50%),但無只讀限制,現代架構首選。
myisampack 是 MyISAM 時代的「壓縮神器」,雖然 MyISAM 逐漸退出歷史舞臺,但其「讀寫分離、靜態壓縮、透明解壓」的設計思想,依然啟發著現代存儲引擎優化。