1.需求
订单表 j_trade_order有6000多万数据,需要迁移3000多万到另外一张表,迁移结束后需要整理表空间
2.OPTIMIZE
整理j_trade_order表空间(InnoDB/MyISAM引擎均支持)
OPTIMIZE TABLE j_trade_order;
●注意事项:
-
执行期间会对表加 排他锁(阻塞所有读写操作),对于 114.79GB 的大表,锁表时间极长,不建议在生产业务高峰期执行;
-
执行后会生成临时表,需要预留至少 2 倍于表大小的磁盘空间(即至少 230GB 空闲磁盘),否则会执行失败。
3.ALTER TABLE
整理j_trade_order表空间,重建表结构和索引,释放碎片空间
ALTER TABLE j_trade_order ENGINE = InnoDB;
● 执行后,表的存储引擎不变(仍为 InnoDB),但表空间会被重新规整,查询性能和磁盘利用率都会提升;
● 对于 114.79GB 的大表,执行时间较长(视服务器 IO 性能而定),建议在业务低峰期执行。
4.验证表数据完整性
对比整理前后的表数据量,确认无丢失
SELECT COUNT() as count FROM j_trade_order;
5.小结
- 生产环境首选 ALTER TABLE j_trade_order ENGINE = InnoDB;(在线操作,影响小,效果好);
- 备选 OPTIMIZE TABLE j_trade_order;(兼容 MyISAM,但锁表时间长,需预留足够磁盘空间);
- 大表操作前必须备份数据、检查磁盘空间,执行后验证碎片率和数据完整性;
- 建议在业务低峰期执行,避免影响线上服务