如何优雅的实现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';

因为结果集相对小一些,处理过程对已有的数据处理线程的效率影响最小,可以避免大结果集导致服务阻塞的情况。

当然关键的部分是整个流程梳理完善后固定下来,我们可以把它转换成一个脚本,这样后续的操作我们只需要输入表名,保留的时间范围即可完成这个看起来略微复杂的需求了。

原文链接:https://blog.csdn.net/yangjianrong1985/article/details/102479380

如何优雅的实现DML批量操作相关推荐

  1. PHP基础教程十四之使用MySqli操作数据库

    前言 在实际的开发中,PHP都是会和数据库一起使用的,因为在后台需要有太多的数据进行保存,而数据库就是一种很好的保存数据的地方,我们PHP开发用到的数据库是关系型数据库mysql,而PHP和mysql ...

  2. Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】

    前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...

  3. Hibernate的批量操作

    批量插入 Hibernate强制开启了一级缓存,缓存空间是有限的,如果批量操作的SQL语句太多,就会运行失败(内存溢出), 因此在批量操作的时候,每执行一批SQL语句,都需要刷新缓存,例如下面这样,每 ...

  4. 打开数据库_打开这份指南,数据库运维也能优雅、简单!

    对于常规数据库的运维监控来说,如何能够快速简洁的发现问题,直达问题本质并解决常见问题,是 Bethune 的安身立命之本. 简约,优雅,专业,直抵本心,这是用户对 Bethune 的评价. Bethu ...

  5. java 批量执行 sql_执行批量操作 - SQL Server | Microsoft Docs

    执行批量操作Performing batch operations 08/12/2019 本文内容 为了提高对 SQL ServerSQL Server 数据库进行多项更新时的性能,Microsoft ...

  6. JDBC中事务、批量操作、大数据类型、获取自动生成的主键、等用法

    1 事务的用法 事务的ACID属性: 通俗的说事务:指一组操作,要么都成功执行,要么都不执行-->原子性在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-->隔离性事务发生前 ...

  7. android卡片风格,[Android] Android 卡片式控件CardView的优雅使用

    [Android] Android 卡片式控件CardView的优雅使用 CardView是在安卓5.0提出的卡片式控件 其具体用法如下: 1.在app/build.gradle 文件中添加 comp ...

  8. Oracle总结【视图、索引、事务、用户权限、批量操作】

    前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...

  9. Redis批量操作--增加,删除,模糊查询

    需求来源 虽然说redis是纯内存操作,效率非常高,但是一次插入或者删除千万级或者亿级的操作,如果采用单条处理的api,整体处理效率还是很低的:另外,如果处理的数据量过大,稍有不慎可能就会导致clie ...

最新文章

  1. Jquery Easy UI Datagrid 上下移动批量保存数据
  2. Programming Pearls: Chatper3 Problem6 [Form letter generator]
  3. 计算机视觉—图像特效(3)
  4. 指令集物联网操作系统 iSysCore OS 2021年将推出 3.0 版本!
  5. 316 Remove Duplicate Letters 去除重复字母
  6. MVC中处理表单提交的方式(Ajax+Jquery)
  7. 【2019百度之星初赛二1003=HDU6676】度度熊与运算式 1(思维)
  8. sqlserver内存释放心得
  9. zabbix开启网页报警声音方法:网页也可以有报警声音(46)
  10. Web设计中最常用的10种色调以及示例演示
  11. 2021湖南高考成绩查询考生版,湖南省普通高校招生考试考生综合信息平台入口2021...
  12. matlab 双点光源干涉的模拟,基于MATLAB的双点光源干涉现象的模拟
  13. LeetCode 力扣C++题解 575. 分糖果
  14. 移动端软件测试面试题及答案-2021年最新版
  15. Unity用代码批量修复材质球shader丢失的问题
  16. 怎样备份iOS已安装、已下架App的IPA文件?
  17. 【转载】CU、PU、TU划分显示代码
  18. Eclipse插件6
  19. js 求最长不重复子串
  20. PHPstudy搭建外网(个人电脑当做服务器)

热门文章

  1. string修饰的梦修改吗_Java String 对象,你真的了解了吗?
  2. dxf转nc代码软件_FastCAM激光版套料软件
  3. 卸载mysql 安装_MySQL萌新第一季 第二话
  4. java面向对象之封装,java面向对象之封装-Go语言中文社区
  5. java knn kd树_KNN算法之KD树(K-dimension Tree)实现 K近邻查询
  6. iwrite提交不了作业_在云端,我们把花样作业pick起来!
  7. springboot接收文件_SpringBoot2.x系列教程61--SpringBoot整合MQ之ActiveMQ实现消息传递
  8. 【Chocolatey】安装python3
  9. 修改服务器ssh登录超时时间
  10. css margin和border,Margin、Border、Padding属性的区别和联系