如何优雅的实现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批量操作的更多相关文章

  1. 【Hibernate框架】批量操作Batch总结

    在我们做.net系统的时候,所做的最常见的批量操作就是批量导入.插入.更新.删除等等,以前我们怎么做呢?基本上有以下几种方式: 1.利用循环调用insert方法,一条条插入. public boole ...

  2. salesforce 零基础学习(三十七) DML及Database方法简单描述

    在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...

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

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

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

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

  5. Hibernate深入浅出(九)持久层操作——数据保存&批量操作

      数据保存: 1)session.save session.save方法用于实体对象到数据库的持久化操作.也就是说,session.save方法调用与实体对象所匹配的Insert SQL,将数据插入 ...

  6. 数据库--MyBatis的(insert,update,delete)三种批量操作

    转自:http://blog.csdn.net/starywx/article/details/23268465 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据 ...

  7. 深度解析Django REST Framework 批量操作

    我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除. 下面我们来讨论这个问题,看看如何实现批量更新和删除操作. DRF基本情况 我们 ...

  8. python代码如何写的优雅?

    简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...

  9. [Egret]优雅的写http

    首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...

随机推荐

  1. 比较两个Sql数据库是否相同

    1.打开VS20122.SQL→架构比较→新建架构比较3.在源和目标上分别填上两个待比较的数据库的信息4.点击比较,不一会儿,系统就会列出两个数据库的差异了.

  2. hadoop HA架构

    什么是Hadoop? http://hadoop.apache.org/ 解决问题:·海量数据的存储 (HDFS)·海量数据的分析 (MapReduce)·资源管理调度 (YARN) 集群规划:(这里 ...

  3. readlink 查看符号链接的文件的内容

    1. 命令功能 readlink 查看软链接文件里的真实内容. 2. 语法格式 readlink [option]  file 参数 参数说明 -f 后跟软链接文件 3. 使用范例 范例1 查看文件链 ...

  4. bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增

    题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立.此题强制在线. 思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个 ...

  5. [thinkphp 5.0源码阅读] 缓存(一)

    保存缓存: user表数据: cache()方法保存缓存: 访问 http://mythinkphp.com/index/index/cache ,两个缓存被保存(runtime/cache目录下): ...

  6. 16.go语言基础学习(上)——2019年12月16日

    2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...

  7. java基础复习(四)

    ---恢复内容开始--- 一.for循环的掌握  语法格式: for( 初始化语句A   ;  条件判断B  ;  循环后功能语句C){ //循环体D } for的执行流程:   整个for循环结构中 ...

  8. SQL Server 中用While循环替代游标Cursor的解决方案

    在编写SQL批处理或存储过程代码的过程中,经常会碰到有些业务逻辑的处理,需要对满足条件的数据记录逐行进行处理,这个时候,大家首先想到的方案大部分是用“游标”进行处理. 举个例子,在订单管理系统中,客服 ...

  9. BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 树形DP

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  10. vue项目适应不同屏幕做的适配器

    一般宽度是1920的,但是有的电脑屏幕很窄,导致页面样式错乱,那么可以设置app.vue以及主页面里的样式宽度为1920px,超过了就auto. 如下: (app.vue) (home.vue) 原效 ...