出现的背景:

公司做了一个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!

转载于:https://www.cnblogs.com/printN/p/7356443.html

大量删除MySQL中的数据相关推荐

  1. mysql中怎么删除表中的一列数据_mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  2. python mysql批量更新_Python批量删除mysql中千万级大量数据的脚本分享

    场景描述 线上mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的,统计结果咋有这么多.运维找过来,磁盘占了200G,最后问了运营,可以只保留最近3天的,前面的数据,只 ...

  3. jsp在mysql中删除数据_如何在jsp页面中删除数据库中的数据

    如何在jsp页面中删除数据库中的数据 各位大虾! 我想在jsp页面上写一个按钮功能,从而动态的删除数据库中的一行数据. 不知道怎么实现 这是我写的一段代码 数据库是MySql UserBean p3= ...

  4. php删除表中一行数据,mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  5. mysql数据库中怎么删除一行_数据库教程_mysql如何删除表中一行数据?- 中国it教程网...

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  6. mysql表如何删除一条数据_mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  7. mysql提供什么语句用于删除表中的数据_MySQL提供【 】语句用于删除表中的数据...

    MySQL提供[ ]语句用于删除表中的数据 答:暂无解析 出头教育: 当双活塞杆液压缸的缸体固定, 活塞杆与运动件固连时,其运动件的运动范 围等于液压缸有效行程的 答:三倍 可同时搜集若干调查单位资料 ...

  8. MySQL 删除表中的数据记录

    文章目录 前言 一.删除表中的数据记录? 1.删除特定数据记录 2.删除所有数据记录 总结 前言 删除数据记录是数据操作中常见的操作,可以删除表中已经存在的数据记录.在MySQL中可以通过DELETE ...

  9. MySql删除表中重复数据

    有一表中存在大量重复数据 在此记录下我删除表内重复数据的方法 -- 新增测试表 create table basic_farmer ( id INT(11), user_name VARCHAR(25 ...

最新文章

  1. python函数编程-偏函数partial function
  2. 对Python认识和对我专业的影响
  3. python7.1处理异常
  4. Zclip-jquery插件支持全浏览器复制
  5. 单循环链表中设置尾指针比设置头指针更好的原因
  6. pem格式证书编码 x509_证书编码格式
  7. less,more,view一个文件时中文可以正常显示,可是VI却显示乱码呢?
  8. jquery中ajax加载js和json文件
  9. Json与List的相互转换 [谷歌的Gson.jar和阿里的fastJson.jar]
  10. php 字符编码转换
  11. python狗屁不通文章生成器_狗屁不通文章生成器,哈哈哈
  12. Sql server 中的bulk insert语句使用
  13. I.MX RT1176笔记(3)-- 双核启动和通信 MU
  14. 把基础打牢了,将来就可以触类旁通,行行都可以写出精彩
  15. 【论文解读】MacBERT: 中文自然语言预训练模型
  16. linux os版本 32或64位查看
  17. 倾斜摄影超大场景的三维模型的顶层合并,提升模型在WEB三维展示效果
  18. 蓝字冲销是什么意思_红字和蓝字冲销
  19. 如何修改PC端微信消息提示音
  20. C语言之复合类型下卷(十九)(自然法则)(2023)

热门文章

  1. jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
  2. 比机器人更优越的半机械昆虫,颜控党们会接受吗?
  3. 从 JavaScript 到 TypeScript
  4. swift 雨燕 新手教程
  5. Bootstrap pc pad phone 响应式布局
  6. android中影藏状态栏和标题栏的几种方法
  7. 笔记2014-08-26
  8. samba在企业网应用
  9. VMware 8.0不能手动安装Linux5.5(命令行)问题解决方法
  10. Linux分区空间不足了怎么办??