每日清理近百万数据,如何保证delete效率?

【业务描述】
会员标签业务,用来为不同会员标记不同标签,会员数在50w+,标签数在2000+,按每个会员命中20个标签计算,会员标签表的数据量维持在1kw+,主键是会员+标签。
数据清理存在两种情况:
1、标签到期,即标签过期,会自动删除记录,此处是按过期时间进行删除。
2、标签重算,即标签需要重新计算命中会员,也会删除记录,此处是按标签进行删除。

【操作描述】
数据每日做日结处理,表内每条数据有一个过期时间,这个时间不固定且可能更新延长,需要对过期数据进行清理,然后插入新数据,预估每日删除数据在百万左右,表大小在千万以上。这些操作都是在同一个表中进行操作。通过delete删除数据。

【环境描述】
服务器为三台服务器混合部署。版本是v4.0.11

【现象】
删除数据超时,速度太慢,有无更好的解决方案或参数调优。

业务层面可以协助你做数据分区么?

按照 (业务主键 + 天 )来分区,这样子你每次删除某天的分区数据行了

用日期做分区表,然后truncate整个分区吧

这个业务查询时不是按过期时间查询的,只有删除的时候是按过期时间删除,并且这个过期时间可能更新延长。如果按过期时间分区,应该会影响查询和更新效率吧。

这样估计会有很多空分区表吧,并且查询不是按日期进行查询的。

那你得寻找一下,哪种分区方式最契合你的需求了(方便你操作)
理论上,不存在空分区表的,因为分区信息一般都是 range (范围的,无数据的分区可不建)

但是查询的时候我记得会扫描空分区表,影响查询效率

做时间分区是常见的优化手段,虽然后很多空分区,也就带来了空region,但这是没法避免的,只能每半年增加一次分区,我没见过日账表,不按照时间查询的业务,能否详细说说?

做日结处理的表,要不就是整删整插,要不就是按日新增,无论哪一种,时间都是个必要属性啊,业务上为啥不加日期条件?

有个布隆表达式,会减缓你说的效率问题,但是不能避免。

变通方案,需要做删除之前,新建一个分区,通过规则把需要 drop 的数据丢到一个分区
然后删除掉哪个分区的数据,删除分区… (只保留一个最大的)

如果有空分区,那性能肯定会降低了

@xfworld @hey-hoho @数据小黑 已更新业务描述,坐等大佬方案:kissing_heart:

分两个表,一个原始表,一个业务表,原始表保存所有数据,包括过期数据和需要更新的数据,每日业务数据更新原始表,然后对原始表做过滤更新业务表,根据其他条件决定,原始表的数据是一直保存还是在每日更新前,拷贝业务表的数据;原始表和业务表更新时都是trucate表操作

是否考虑用redis实现

硬件支撑不起来:joy:

:sweat_smile:话说update的效率也不是很高呀~ 现在考虑在程序里做批量循环删除

你的这个表的数据是怎么更新的?我的设计里面,除了这个环节,其他的不需要update,都可以是insert

原业务中,是没有更新的,只有清理过期标签,和新增新标签记录。因为是按标签循环命中会员的,而不是按照会员去匹配标签。

其实涉及标签的业务,用es是不是更合适。

我们的客户技术能力都相对偏弱,再加上硬件投入不会太大,不会考虑引入其他组件。