出现的背景:

公司做了一个redis相关的项目,其中mysql存储了很多统计数据。比如客户端上报的数据,redis实例的数据,应用的数据,机器的数据等。每天都在上报,采集,由于没有定期删除,数据大量累积。大概有一年左右的数据,一个表的数据已经达到亿级别的。这样算下来,一个表的数据至少是几十GB了。因此需要删除过期的数据,暂时保留近三个月的统计数据。

解决方案:

基本每个表都有个字段叫create_time或者collect_time的字段,只要删除这个字段三个月之前的数据就ok了

delete from table_name where create_time < '2017-04-06'

只要执行这句SQL应该就可以了

遇到的问题:

The total number of locks exceeds the lock table size in MySQL

因为需要删除的数据太大,mysql给的buffer好像只有8MB左右(网上搜到的)

后面找到DBA帮忙看,问这个表建了索引没有

show index from table_name

通过查看索引,我们在create_time和collect_time上是建了索引的,索引类型是BTree,ASC。这里我们用的Mysql引擎是InnoDb

delete from table_name where create_time < '2017-07-06'  order by create_time asc limit 10000

接着,我想用order by + limit实现删除,还是出现了上面的错误

后面DBA提示我说,为啥不用ID删除,说按id删除,速度和按索引列删除,不是一个数量级的

接着我想到了拆分一下。

最终解决方案:

找出符合条件的create_time和collect_time的最大ID

select max(id) from table_name where create_time < '2017-04-06'

这里千万左右的数据大概需要10多秒

接着按id删除,一次删除10k,循环删除

delete from table_name where id < maxId limit 10000

直到把过期的时间删除完成

这里我没有msyql服务器的权限,通过java客户端连接删除,使用的spring jdbcTemplate这个接口

另外,这里一次删除10k还有个原因是,事务太大,影响其他服务的运行

还用到的技术,就是使用线程池来执行sql删除,实现异步删除。和同事吃饭的时候,同事也提供了一个解决方案,每次删一秒的数据,这样一次次的删。看了一下数据,一秒的数据基本在几十万,左右,这样不太好控制数据量大小。还是通过主键id + limit 10k这里稳妥一点。

还有一点就是,为了怕压到mysql服务器,这里线程池删除的时候回sleep(1000),阻塞1s再删除,减轻mysql服务器的压力

今天搞了一下数据删除这一点东西,感觉mysql水很深,比如一个select count(*)的执行过程,select from table_name order by id limit 的过程,索引,各种连接,引擎的工作原理。走的时候还有点没有调完,明天应该可以搞定这些了。

Please call me JiangYouDang!

大量删除MySQL中的数据的更多相关文章

  1. PHP MySQL Delete删除数据库中的数据

    PHP MySQL Delete DELETE 语句用于从数据库表中删除行. 删除数据库中的数据 DELETE FROM 语句用于从数据库表中删除记录. 语法 DELETE FROM table_na ...

  2. PHP mysql 删除表中所有数据只保留一条

    DELETE FROM `logs` WHERE wangzhi='www.juhutang.com' and id<>101072; 上面这段代码的意思为 删除表logs中 所有字段wa ...

  3. 超实用--删除MYSQL中指定的数据的全部表

    作过的人都知道,重复测试数据库的苦恼. 用法:# Usage: ./script user password dbnane mysql.nixcraft.in ~~~~~~~~~~~~~ #!/bin ...

  4. PHP读取mysql中的数据

    <!DOCTYPE HTML> <html> <head> <title> PHP动态读取mysql中的数据 </title> <me ...

  5. 辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作

    对于mysql中的数据碎片,事实上和我们删除数据是息息相关的,删除数据的时候必定会在数据文件里造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间.假设在一段时间内的大量的删除操作,会 ...

  6. Vusual C++连接Mysql和从MySql中取出数据的API介绍

    .1 mysql_real_connect() 2.1.1 函数原型: MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const ...

  7. 用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...

  8. PHP如何批量更新MYSQL中的数据

    最近项目需要用到批量更新数据库里的数据,在网上找了一下这方面的例子,觉得这个还不错,分享给大家. 在这个业务里里面涉及到了更新两张数据表,那么大家是不是会想到非常简单,马上上代码 $sql ,type ...

  9. ROWID面试题-删除表中重复数据(重复数据保留一个)

    /* ROWID是行ID,通过它一定可以定位到r任意一行的数据记录 ROWID DNAME DEPTNO LOC ------------------ ------------------------ ...

随机推荐

  1. 洛谷.1501.[国家集训队]Tree II(LCT)

    题目链接 日常zz被define里没取模坑 //标记下放同线段树 注意51061^2 > 2147483647,要开unsigned int //*sz[]别忘了.. #include < ...

  2. struts2动态跳转action,修改和添加共用一个页面

    <s:form action="role_%{ id == null ? 'add' : 'edit' }"> <s:hidden name="id&q ...

  3. [原创]推荐一些在线API生成工具

    [原创]推荐一些在线API生成工具 最近发现Api文档维护是个大体力活,版本控制文档统一化特别麻烦,寻思着这个怎么处理,经高人指点开源有一些工具不错,具体如下: 1.Swagger   http:// ...

  4. HTML篇之CSS样式:<button></button>按钮变成超链接<a></a>的样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. .net core程序中使用微软的依赖注入框架

    我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...

  6. JavaScript – Convert Image to Base64 String

    From: https://bytenota.com/javascript-convert-image-to-base64-string/ his post shows you two approac ...

  7. CentOS 7搭建Linux GPU服务器

    1. CUDA Toolkit的安装 到https://developer.nvidia.com/cuda-gpus查询GPU支持的CUDA版本: 到https://developer.nvidia. ...

  8. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  9. Uploadify导致Chrome频繁崩溃Crash

    上传功能是工作中经常会遇到的问题,应该作为开发标配的技能每个人都会. 我选用的是Uploadify 3.1.2进行上传,使用方法参考之前的一篇文章, 今天记录下一个我遇到的很神奇的bug chrome ...

  10. 分区工具parted的详解及常用分区使用方法【转】

    来源:http://blog.51cto.com/zhangmingqian/1068779 分区工具parted的详解及常用分区使用方法 一.         parted的用途及说明 概括使用说明 ...