如何优雅的实现DML批量操作
如何优雅的实现DML批量操作(转载)
昨天处理了一个业务同学的数据需求,简单来说就是对一张大表做一下数据清理,数据量在8千万左右,需要保留近一个月的数据,大概是400万左右。
对于数据的删除处理,尤其是大表的处理,可以借助MySQL特有的一种处理策略,可以参考之前的文章:
从处理方式来看,基本就是做了rename,把原来表的数据转置到一个中间库里面,然后补录数据,对于日志型的数据表来说是很有必要的。

但是这种方式涉及几个细节,主要的出发点就是怎么样让这个操作更加可控,我所说的意思是整个处理过程你可以按部就班的操作,该备份备份,而补录补录,而对线上的切换过程都是毫秒级完成,几乎产生不了直接影响,要实现这个看似不大可能的需求,我们就需要设定几个边界:
1)数据类型为流水型业务,不涉及事务处理
2)数据流程不会修改历史数据,仅仅参考近N(可以为N,也可以为当天)的数据
3)操作的时机不是业务高峰期
4)能够接受秒级的数据写入闪断
明确了这些不能够之后,我们来看看怎么来实现这个目标,可以参考如下的流程图:
所以要实现这个目标,我们需要尽可能保证中转表的数据要尽可能完整,而且要保证数据切换能够高效完成。
那么我们处理的思路就是增量迭代,即最后的切换阶段耗时最短,我们可以提前复制需要补录的数据,同时对当天的数据进行增量的补录,然后开始切换。
我们可以参考如下的步骤:
1)首先创建同样结构的表,包括索引,一个表是做备份,一个是作为中转。
mysql> create table cmec_log_arch.log like cmec_log.log;
mysql> create table cmec_log_arch.log_new like cmec_log.log;
2)需要把近一个月的数据表现存放到中转表log_new里面,为了提高效率,我们先保证当天的数据有效。
mysql> insert into cmec_log_arch.log_new select * from cmec_log.log where cdate between '2019-09-18' and '2019-09-18 10:00:00'; --当前时间大于10:00:00,但是间隔不大
我们可以缩小时间间隔,完成增量数据的补录,直到增量数据的补录时长控制在秒级(数据集越小,处理时长越短)
2)然后切换表
mysql> RENAME TABLE cmec_log.log TO cmec_log_arch.log_bak,
cmec_log_arch.log TO cmec_log.log,
cmec_log_arch.log_bak TO cmec_log_arch.log;
Query OK, 0 rows affected (0.18 sec)
整个切换过程是很快的。
4)接着我们进行历史数据的补录,完成了当天数据的补录,我们只需要关注历史数据的范围即可。
为了尽可能降低对岸上环境的应县个,我们需要缩小补录的时间范围,比如按照如下的方式来进行补录:insert into cmec_log.log select * from cmec_log_arch.log_new where cdate between '2019-09-16' and '2019-09-17';
因为结果集相对小一些,处理过程对已有的数据处理线程的效率影响最小,可以避免大结果集导致服务阻塞的情况。
当然关键的部分是整个流程梳理完善后固定下来,我们可以把它转换成一个脚本,这样后续的操作我们只需要输入表名,保留的时间范围即可完成这个看起来略微复杂的需求了。
————————————————
版权声明:本文为CSDN博主「jeanron100」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangjianrong1985/article/details/102479380
如何优雅的实现DML批量操作的更多相关文章
- 【Hibernate框架】批量操作Batch总结
在我们做.net系统的时候,所做的最常见的批量操作就是批量导入.插入.更新.删除等等,以前我们怎么做呢?基本上有以下几种方式: 1.利用循环调用insert方法,一条条插入. public boole ...
- salesforce 零基础学习(三十七) DML及Database方法简单描述
在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...
- Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...
- Oracle总结【视图、索引、事务、用户权限、批量操作】
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了...那么本篇主要总结关于Oralce视图.序列.事务的一些内容... 在数据库中,我们可以把各种的SQL语句分为四大类 ...
- Hibernate深入浅出(九)持久层操作——数据保存&批量操作
数据保存: 1)session.save session.save方法用于实体对象到数据库的持久化操作.也就是说,session.save方法调用与实体对象所匹配的Insert SQL,将数据插入 ...
- 数据库--MyBatis的(insert,update,delete)三种批量操作
转自:http://blog.csdn.net/starywx/article/details/23268465 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据 ...
- 深度解析Django REST Framework 批量操作
我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除. 下面我们来讨论这个问题,看看如何实现批量更新和删除操作. DRF基本情况 我们 ...
- python代码如何写的优雅?
简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...
- [Egret]优雅的写http
首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...
随机推荐
- 09.Linux系统由于不正常关机导致的分区问题
问题:Error:UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY Give root password for maintenance ------------ ...
- BZOJ-1907 树的路径覆盖 贪心
题意:给一个n个点的树,求树的最小路径覆盖.(这个最小路径覆盖不能有重点) 解法:往图论方向想很久,想得太复杂了,其实直接贪心.这个大佬题解写得很好: https://blog.csdn.net/bl ...
- scapy - 基于python的数据包操作库
简介 地址:https://github.com/secdev/scapy scapy是一个基于python的交互式数据包操作程序和库. 它能够伪造或者解码多种协议的数据包,通过使用pcap文件对他们 ...
- man fdisk
FDISK(8) Linux Programmer?. Manual/Linux程序手册 FDISK(8) NAME/名称 fdisk - Partition ta ...
- Fckeditor实现WORD粘贴图片自动上传
在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper. 通过知乎提供的思路找到粘贴的原理,通过TheViper找 ...
- 如何从Word带图粘贴到编辑器中
这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用 后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下) ...
- 【CF1243B1】Character Swap (Easy Version)【思维】
题意:给你两个字符串,问是否存在交换方案使得两个字符串变成一样的,方案为只交换一次且只交换s1与s2里的一个字符 题解:若一开始就相同,则存在交换方案 若一开始不同的位置为1个或大于2个,则不存在方案 ...
- easyui for jquery之tooltip
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【HDOJ6684】Rikka with Game(博弈)
题意:有一个由小写字母组成的字符串,A和B两个人轮流操作,A想让序列的字典序最大,B想最小 两人都能任意选择一位上的字母将其右移一位(a->b,b->c……z->a)或者直接结束游戏 ...
- 【转】网站出现service unavailable的解决方法
特别提示:本文的教程仅适合采用windows服务器的IIS组件上操作,service unavailable是许多网站会经常遇到的问题,希望对大家有用. 昨天一小段时间网站出现了service una ...