定时任务分批删除大表数据策略

一、需求背景

由于系统中存在许多临时表,这些临时表主要用于解析附件或者Excel或者合并资源池数据等等业务功能。
随着时间的积累,数据量越来越大,其中最大的一个表数据量达到了22亿,因此需要对这些临时表进行定时清理,节省数据库存储空间和提升查询效率。

二、技术方案

需要保留最近15天的数据且数据量太大,不能直接delete,所以采用定时任务每天凌晨3点分批进行删除策略。由于数据库主键id采用自增方式,所以这里采用代码分批计算最大最小主键id方式进行删除,另外每次循环删除的最大行数、执行间隔通过配置数据字典方式更加方便灵活控制。

1、历史数据处理

(1)新建相同表结构的数据表,新表补充creation_date的索引,利用同步工具同步最新15天的数据到新表。
(2)校验新表和旧表的数据一致性(统计总行数、查询最大id和最小id等)
(3)将新表替换为旧表(可以通过重命名方式)
(4)完成历史数据的清理(需要数据库服务器停机操作)

2、大表定时清理

大表数据可能一天达到几千万条,需要按照时间分段再分批处理。
此步骤前提是完成历史数据处理之后且建立creation_date的索引。
结束时间endDate:当前时间-15天
开始时间startDate:endDate-intervalHours(间隔时间)
最小主键minId:

select id as minId from relation_temp_t where creation_date >= #{startDate} order by creation_date asc limit 1;

最大主键maxId:

select id as maxId from relation_temp_t where creation_date <= #{endDate} order by creation_date desc limit 1;

每次删除的最大数量按照10000条进行限制。
分批执行的最大时间不超过默认配置时间2h,若在2h内还没有执行完成,则终止删除,等下次调度时间再重新发起执行删除操作。
删除脚本为:

delete from relation_temp_t where id between #{minId} and #{maxId} and creation_date between #{startDate} and #{endDate};

三、代码实现

public int newChildJobTask(){
   
   
	PeriodDataCleanVo cleanVo = getPeriodDataCleanVo
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值