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_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 秒,虽然还是有些久,但是比两千多万条的时候还是要好上很多

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值