【个人小结】一次数据库性能优化问题

 

需求场景:存在表t_result_changelog,表记录了caseNo的相关数据,有些caseNo已经被删除,但表中的数据没有对应清理。

难点分析:判断表中哪些数据已经被删除,需要在对应版本的caseInfo_version中查找

 

初次尝试:

选择表中所有的caseNo以及他们的cVersion

select cVersion, caseNo from t_result_changelog group by cVersion, caseNo

判断caseNo是否在对应的表中存在

select count(*) from  `tbl_caseinfo_${version}` where caseNo = #{caseNo}

删除

delete from t_result_changelog where cVersion = #{cVersion} and caseNo = #{caseNo}

耗时情况,大概1秒处理4个用例,计算了一下,处理完所有10万用例需要7个小时

 

修改后:

获得表中所有的cversion(因为cversion数量是少的,清理前都只有十多个)

select distinct(cVersion) from ${tableName}

选择这个cversion下,存在于t_result_changlog但不存在于对应的caseinfo表中的数据

(通过这个操作,避免之前对于所有用例的遍历判断)

select distinct(caseNo) from t_result_changelog where cVersion = #{cversion} and caseNo not in (select caseNo from tbl_caseinfo_${versionTbl})

删除

delete from t_result_changelog where caseNo in 
		<foreach item="caseNotExisted" collection="casesNotExisted" open="(" separator="," close=")">
			#{caseNotExisted}
		</foreach> 

如果版本表都不存在,直接删除

delete from t_result_changelog where cVersion = #{cVersion}

耗时21334ms

数据清理情况
 清理前清理后
不重复用例数105974315
总数据条数6034073718

 

反思总结:

1. 避免不必要的操作

2. 能在一个sql里面进行完的决不拆开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值