最近在检查数据的时候发现有个表格数据已经达到了两千多万,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_time>='2025-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_time>='2025-11-01';操作完再检查一下数据,可以发现还有五百多万条,查询时间 5.5 秒,虽然还是有些久,但是比两千多万条的时候还是要好上很多