最新项目一直出现线上问题,定位原因看到是由于表数据过大导致的,现在有个登录表,登录游戏玩家每次登录的信息,久而久之,这几个表的数据量达到了两亿多条。每天都在上报,采集,由于没有定期删除,数据大量累积。大概有一年左右的数据,一个表的数据已经达到亿级别的。这样算下来,一个表的数据至少是几十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 的过程,索引,各种连接,引擎的工作原理。走的时候还有点没有调完,明天应该可以搞定这些了。

转载于:https://www.cnblogs.com/gxyandwmm/p/10210651.html

如何高效的批量删除亿级大表数据相关推荐

  1. 亿级大表分库分表实战总结(万字干货,实战复盘)

    亿级大表分库分表实战总结(万字干货,实战复盘) 以下文章来源于阿丸笔记 ,作者阿丸笔记 阿丸笔记 分库分表的文章网上非常多,但是大多内容比较零散,以讲解知识点为主,没有完整地说明一个大表的切分.新架构 ...

  2. 一入职!就遇到MySQL亿级大表优化....

    作者丨jia-xin 出处: https://www.cnblogs.com/YangJiaXin/p/10828244.html "前段时间刚入职一家公司,就遇到了 MySQL 亿级大表优 ...

  3. 亿级大表在线不锁表变更字段与索引

    摘要:在业界中有一个比较成熟的工具,针对大表的场景,可以在线进行Alter变更,且不会出现锁表的风险.除此之外,它还有其他的一些优点,让我们开始探索吧. 背景 大家在日常工作中,往往需要对数据库的表结 ...

  4. [生产库实战] 如何使用触发器对生产库上亿级大表进行实时同步

    触发器迁移数据和Oracle 物化视图(MV)的原理相同,通过在源表创建Trigger,记录源表的DML操作日志,然后通过存储过程同步DML受影响的记录,达到目标表和源表数据一致的效果.此方法只是对P ...

  5. MariaDB 10.3 instant ADD COLUMN亿级大表毫秒级加字段

    加字段是痛苦的,需要对表进行重建,尤其是对亿级别的大表,虽然Online DDL可以避免锁表,但如果在主库上执行耗时30分钟,那么再复制到从库上执行,主从复制就出现延迟.使用instant ADD C ...

  6. [NewLife.XCode]分表分库(百亿级大数据存储)

    NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...

  7. 千亿级大数据如何存储的?

    在社区,有用户提到了一个这样的问题,千亿级大数据如何存储.这位同学给出了以下的使用背景. 我们关注到他的问题描述,虽然整体数据量并不是很大,但从应用场景上来看,非常符合时序数据库(Time-Serie ...

  8. 如何优化MySQL千万级大表

    很好的一篇博客,转载 如何优化MySQL千万级大表 原文链接::https://blog.csdn.net/yangjianrong1985/article/details/102675334 千万级 ...

  9. 来个硬货——长文解读:基于业务场景的MySQL千万级大表优化

    千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议. 从一开始脑海里开始也是火光 ...

  10. 千亿级服务器监控数据存储实践

    千亿级服务器监控数据存储实践 背景 近几年开源的大数据处理系统已经逐步发展到一个比较成熟的阶段了,各类大数据处理的场景都有了相应的解决方案,如同 mysql 在当今互联网公司中的关系数据存储广泛应用地 ...

最新文章

  1. R 语言关于 SSL 证书异常处理笔记
  2. Runnable和Thread的区别
  3. SVN Switch
  4. nginx源码分析—内存池结构ngx_pool_t及内存管理
  5. CVPR 2022 3月7日论文速递(17 篇打包下载)涵盖 3D 目标检测、医学影像、图像去模糊、车道线检测等方向
  6. 将Reporting Service 2005 SP2集成部署到WSS3或MOSS2007服务器场心得
  7. jzoj2940-生成输入数据【最小生成树,并查集】
  8. Entity Framework(二)
  9. javascript之调度:setTimeout 和 setInterval
  10. 集成学习——XGBoost原理理解
  11. JS之经典for循环闭包问题解决方法
  12. 数据预处理—5.box-cox变换及python实现
  13. ibm java虚拟机_IBM java VM 最新版的java虚拟机下载及安装的一点说明
  14. python pandas 数据透视表_python 用pandas实现数据透视表功能
  15. activiti设计器会签人员配置
  16. 关于我的论文以及毕业设计的一些总结吧——基于物联网技术的智能实验室管理系统设计与实现
  17. 工作一年心路历程及个人感悟
  18. 诸如zxing二维码调用摄像头旋转角度问题解决方法
  19. 搜索效果和搜索动画效果
  20. 算法笔记 简单贪心(月饼问题)

热门文章

  1. 数据库习题(填空题三)
  2. 切换无线网卡失败服务器提示,Win7系统切换usb无线网卡为AP模式时提示ICS启动失败如何解决...
  3. php5apache2.dll,Apache2.2.8 + PHP5.2.5不能加载php5apache2.dll
  4. python中合并字符串的库函数是_《Python Cookbook(第2版)中文版》——1.6 合并字符串...
  5. html5注册阿里巴巴作业,面试分享:2018阿里巴巴前端面试总结(题目+答案)
  6. Linux基础之tr与重定向管道
  7. 坑nyoj1088 just do it
  8. python爬虫 同花顺_python Flask+爬虫制作股票查询、历史数据、股评词云网页
  9. 自动驾驶 5-2 使用 PID 进行纵向速度控制 Longitudinal Speed Control with PID
  10. 猴子都能懂的数据库范式详解