今天做一个需求,需要清除掉DB中用户参与活动的记录,大概看了下, so easy, 提取出用户ID包,复用一个以前用到的清理清理脚本,后台运行の,慢悠悠的去打了杯水回来打开运行日志瞧了瞧,发现这清理速度咋这慢,每秒只删除50条,照这速度,得删到何年何月啊?!不行,得想改进办法。
仔细分析,发现两个问题:
1、脚本删除数据用了短连接,对删除数据量小的情况下影响不大,但是大数据量批量删除时,大量的重复连接不仅对删除速度影响很大,而且对数据库本身压力也会很大;
2、用户ID包中的用户ID是随机的,但由于用户数较多,DB采用分库分表的方式来存储用户信息,分库分表规则为:对用户ID取模,根据用户ID最后两位,倒数三四位分库,建百库百表。很明显,如果数据包中用户ID是随机的话,那么删除数据时连接各数据库表也是在不断变化的,明显会影响删除速度。
问题找到了,如何避免呢? 解决办法很简单:
1、将短连接修改为长连接;
2、对用户ID包按照数据库表规则进行排序,一个表一个表的数据进行删除。
办法1很好解决,办法2需要抽象出问题的解决方法为:对用户ID包进行排序,首先按照用户ID进行全排序,再按照用户ID最后四位进行排序(两次排序效果是叠加的)。
1、按照用户ID进行全排序:
2、将用户ID后四位提取出来单独作为一列,作为后面排序的依据;