MySQL对大表格做数据归档

📅 2026/6/24 10:10:38
MySQL对大表格做数据归档
最近在检查数据的时候发现有个表格数据已经达到了两千多万select count(*) 需要二十多秒所以准备对历史数据进行一次归档跟业务部门沟通他们说只需要保留半年数据即可这样就可以把大量的历史数据移出当前业务表格减少当前表的操作压力首先大家千万不要因为业务部门说历史数据不查就直接 delete注意大表千万不要直接 delete如果删除的条件没有索引会直接锁表如此大的数据量删除需要很久锁表过程也会很长然后删除条件有索引的情况也不建议直接 delete会产生大量 undo/redo 日志这个过程除了会删数据记录还会删索引记录数据量太大会消耗大量资源导致数据库性能下降影响其服务稳定所以我们用下面的方法快捷方便稳定 注意如果做了主从复制需监控从库延迟情况# 创建一个表用来接收我们需要保留的数据CREATE TABLE alarm_appendix_new LIKE alarm_appendix;# 将我们要保留的数据导入到新表这个过程可能会持续3-5分钟建议暂停服务操作如果服务不能暂停可以在下一个操作完成后再做一次数据补充INSERT INTO alarm_appendix_new SELECT * FROM alarm_appendix WHERE insert_time2025-11-01;# 直接将原始业务表格改为备份表此过程是原子操作将新表改为业务表格注意如果没有暂停服务和上一个操作间隔太久可能会存在数据遗漏需要补充数据RENAME TABLE alarm_appendix TO alarm_appendix_bak_20260623, alarm_appendix_new TO alarm_appendix;# 防止备份切换过程中存在数据遗漏注意该操作要求表有主键不然自己写sql补充也可以INSERT IGNORE INTO alarm_appendix SELECT * FROM alarm_appendix_bak_20260623 WHERE insert_time2025-11-01;操作完再检查一下数据可以发现还有五百多万条查询时间 5.5 秒虽然还是有些久但是比两千多万条的时候还是要好上很多