cmec

如何优雅的实现DML批量操作

孤者浪人 提交于 2019-12-02 13:12:00
如何优雅的实现DML批量操作(转载) 昨天处理了一个业务同学的数据需求,简单来说就是对一张大表做一下数据清理,数据量在8千万左右,需要保留近一个月的数据,大概是400万左右。 对于数据的删除处理,尤其是大表的处理,可以借助MySQL特有的一种处理策略,可以参考之前的文章: 从处理方式来看,基本就是做了rename,把原来表的数据转置到一个中间库里面,然后补录数据,对于日志型的数据表来说是很有必要的。 但是这种方式涉及几个细节,主要的出发点就是怎么样让这个操作更加可控,我所说的意思是整个处理过程你可以按部就班的操作,该备份备份,而补录补录,而对线上的切换过程都是毫秒级完成,几乎产生不了直接影响,要实现这个看似不大可能的需求,我们就需要设定几个边界: 1)数据类型为流水型业务,不涉及事务处理 2)数据流程不会修改历史数据,仅仅参考近N(可以为N,也可以为当天)的数据 3)操作的时机不是业务高峰期 4)能够接受秒级的数据写入闪断 明确了这些不能够之后,我们来看看怎么来实现这个目标,可以参考如下的流程图: 所以要实现这个目标,我们需要尽可能保证中转表的数据要尽可能完整,而且要保证数据切换能够高效完成。 那么我们处理的思路就是增量迭代,即最后的切换阶段耗时最短,我们可以提前复制需要补录的数据,同时对当天的数据进行增量的补录,然后开始切换。 我们可以参考如下的步骤: 1)首先创建同样结构的表