首页 / MYSQL / 大量删除MySQL中的数据
大量删除MySQL中的数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了大量删除MySQL中的数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2359字,纯文字阅读大概需要4分钟。
内容图文
![大量删除MySQL中的数据](/upload/InfoBanner/zyjiaocheng/489/a865929c50894696a2b7a3578742d923.jpg)
出现的背景:
公司做了一个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 的过程,索引,各种连接,引擎的工作原理。走的时候还有点没有调完,明天应该可以搞定这些了。
大量删除MySQL中的数据
标签:问题: pre spring mit 删除mysql ber limit 权限 tab
本文系统来源:http://www.cnblogs.com/printN/p/7356443.html
内容总结
以上是互联网集市为您收集整理的大量删除MySQL中的数据全部内容,希望文章能够帮你解决大量删除MySQL中的数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。