archive引擎专为只读归档设计,支持zlib高压缩(70%–90%)和高并发插入,但不支持索引、update/delete及事务,仅适用于日志、审计等冷数据场景。

用 myisampack 或 Archive 引擎 做冷备,本质是面向「只读、不更新、体量大、访问极少」的历史数据做极致压缩与低成本落盘。它不是通用归档方案,而是特定场景下的轻量级冷存储手段——适合日志、审计记录、已完结订单明细等典型冷数据,不适合需要查询、关联或后续修改的数据。
Archive 引擎:专为写入后冻结设计
Archive 是 MySQL 原生的无事务、无索引、只追加引擎,核心价值在「高压缩 + 低开销 + 高写入吞吐」:
- 所有数据自动用 zlib 压缩,实测压缩率常达 70%–90%,大幅节省磁盘空间
- 不支持
UPDATE/DELETE,也不支持普通索引(仅支持主键隐式自增),天然杜绝误操作,保障数据不可变性 - 适合批量插入后长期封存,比如把半年前已完成且无退款的订单批量导入
orders_archive表 - 查询性能弱(全表扫描),但若只是偶尔按主键查单条或导出做离线分析,完全够用
建表示例:
CREATE TABLE orders_archive ( id BIGINT NOT NULL AUTO_INCREMENT, order_id VARCHAR(32) NOT NULL, amount DECIMAL(10,2), create_time DATETIME, PRIMARY KEY (id) ) ENGINE=ARCHIVE;
迁移数据建议用 INSERT ... SELECT 分批执行,避免长事务;例如每次搬 1 万行:
INSERT INTO orders_archive SELECT * FROM orders_main WHERE create_time <h3>myisampack:仅适用于 MyISAM 表的静态压缩归档</h3><p><code>myisampack</code> 是 MySQL 自带命令行工具,只能作用于 <strong>MyISAM 表</strong>,且要求表已停止写入(即必须停服或锁表)。它把数据文件打包压缩成只读的 .MRG/.MYI/.MYD 文件,压缩后无法再写入,也不能在线修改结构。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2334" title="MySQL"><img src="https://img.php.cn/upload/skill/000/000/081/178900927846657.jpg" alt="MySQL" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill2334" title="MySQL" class="overflowclass">MySQL</a> <p class="overflowclass">编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。</p> </div> <a rel="nofollow" href="/xiazai/skill2334" title="MySQL" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 适用前提:你的历史表仍是 MyISAM(InnoDB 表不支持);业务可接受短时停写;对压缩率敏感(通常比 Archive 引擎更高)
- 操作流程:先
FLUSH TABLES orders_his WITH READ LOCK,再 shell 执行myisampack /var/lib/mysql/db/orders_his.MYI,最后myisamchk -rq重建索引(如有) - 压缩后表自动变为只读,应用层需改查逻辑(如加
READ ONLY提示或路由到专用归档库) - 缺点明显:无法热操作、不兼容 InnoDB、恢复需解包+重建,运维链路长
搭配 OSS 等对象存储做二级归档更稳妥
Archive 表和 myisampack 都仍保留在本地 MySQL 实例中,占用实例资源。真正释放压力,建议组合使用:
- 第一步:用
SELECT ... INTO OUTFILE或mysqldump --tab导出冷数据为 CSV/TSV 文本 - 第二步:上传至 OSS 的「归档」或「冷归档」类型(持久性 12 个 9,存储成本比 SSD 低 80%+)
- 第三步:本地 Archive 表保留最近 1–2 年高频归档查询需求;OSS 存更久远数据,按需用
LOAD DATA FROM S3(MySQL 8.0+)或 Spark 临时拉取
这样既发挥 Archive 引擎的 MySQL 原生便利性,又规避了单实例存储瓶颈,也符合“热→温→冷→归档”四级分层理念。
什么情况不建议用这两种方式
以下场景请绕道,选分区表 + 外部归档库(如 ClickHouse、OSS)或逻辑分库方案:
- 表是 InnoDB 引擎(
myisampack完全无效) - 冷数据仍有不定期 UPDATE 或 DELETE(Archive 不支持)
- 需要按非主键字段快速检索(Archive 全表扫,无索引)
- 单表超 5 亿行或日增千万级(Archive 写入会变慢,应前置分表)
- 要求备份可跨版本恢复或支持 PITR(时间点恢复)
Archive 和 myisampack 是“小而准”的冷备工具,不是万能胶。用对地方,省心省钱;硬套场景,反而增加维护负担。










