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

每天進步一點點:myisampack 壓縮只讀表釋放 50%+ 磁盤空間

     編輯:MySQL 綜合教學

每天進步一點點:myisampack 壓縮只讀表釋放 50%+ 磁盤空間

myisampack 是 MyISAM 存儲引擎專用的**只讀表壓縮工具**,將 .MYD 數據文件壓縮為 .MYI 索引可直接讀取的壓縮格式,典型壓縮比 40%-70%,極大節省存儲與 I/O,適配歸檔表、日志表、字典表等**寫一次讀多、不再修改**的場景。

核心原理

  • 逐列分析數據分佈,選擇最優編碼:Huffman 編碼、前綴壓縮、定長轉變長、NULL 位圖優化等。
  • 生成只讀壓縮表,不可再執行 INSERT/UPDATE/DELETE,只能 SELECT。
  • 解壓在 Server 層透明進行,客戶端無感知,索引正常工作。

操作流程

# 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)

避坑指南

  1. 必須 FLUSH TABLES WITH READ LOCK:壓縮過程表被打開會報錯「table is in use」。
  2. 壓縮後不可寫入:誤操作會損壞表,需從備份恢復。
  3. myisamchk -rq 必須執行:重建索引指針指向壓縮後數據偏移量,否則查詢報錯。
  4. MySQL 8.0+ 漸棄 MyISAM:新項目優先考慮 InnoDB + 頁壓縮 COMPRESSION='zlib' / ROW_FORMAT=COMPRESSED。
  5. 大表壓縮耗時久:百 GB 級表可能需數小時,規劃維護窗口。

InnoDB 替代方案

-- 建表指定壓縮
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 逐漸退出歷史舞臺,但其「讀寫分離、靜態壓縮、透明解壓」的設計思想,依然啟發著現代存儲引擎優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved