前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何高效的批量删除亿级大表数据

如何高效的批量删除亿级大表数据

作者头像
小勇DW3
发布于 2019-01-03 03:02:33
发布于 2019-01-03 03:02:33
1.6K0
举报
文章被收录于专栏:小勇DW3小勇DW3

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
告诉你最简单的方式搭建MySQL、Redis、MongoDB数据库
数据库在我们日常开发中接触是很多的,平时自己没事写一些东西也经常会用到,之前专门写过安装MySQL、Redis、MongoDB的文章,各种安装配置还是比较麻烦的,为了记下安装步骤方便后期再安装。现在发现其实docker有现成的,几条命令就能搭建一个数据库出来,方便至极,简单记录一下,方便大家使用。
星星在线
2019/07/17
1.6K0
Docker实操:安装MySQL5.7详解(保姆级教程)
Docker Hub中MySQL介绍:https://hub.docker.com/_/mysql
不惑
2023/11/10
27K5
Docker实操:安装MySQL5.7详解(保姆级教程)
借力 Docker ,三分钟搞定 MySQL 主从复制!
hello 各位小伙伴大家好,今年 5 月份的时候,松哥和大家聊过如何搭建 MySQL 主从复制:
江南一点雨
2019/11/06
9370
借力 Docker ,三分钟搞定 MySQL 主从复制!
【云原生| Docker】 部署 Django & mysql 项目
从整体上看,我们定义了二个容器,分别是app、db,容器之间通过定义的端口进行通讯。定义了网络db_network,只有处在同一网络下的容器才能够互相通讯。不同网络之间是隔离的,即便采用同样的端口,也无法通讯。
计算机魔术师
2022/08/19
1.9K0
【云原生| Docker】 部署 Django & mysql 项目
【Docker系列】docker-compose一步帮你搞定n个容器
docker-compose是docker提供的一个命令行工具,用来定义和运行由多个容器组成的应用。
用户9913368
2022/08/13
2.5K0
在 Docker 中部署 Mysql 并挂载配置文件
首先,在主机上创建一个目录,用于存放 MySQL 的配置文件。例如,创建一个名为 mysql 的目录,用于存放 MySQL 的配置文件。
程序员朱永胜
2023/08/17
1.9K0
【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!
在虚拟机中执行 ipv4 命令的主要目的是配置虚拟机的网络接口,使其能够正常地连接到网络。IPv4 是当前广泛使用的 IP 协议,它是 Internet 协议族中的一员,用于在互联网上标识和定位网络设备。在虚拟化环境中,虚拟机需要一个唯一的 IPv4 地址,以便与其他设备进行通信。
JavaEdge
2023/05/02
6.1K0
【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!
Docker笔记
1.创建空文件夹 假设新建一个名为wordpress的文件夹,然后进入这个文件夹。
hankleo
2020/09/17
4230
Docker-compose封装mysql并初始化数据以及redis
现有一台服务器,需要部署mysql和redis。其中mysql容器,需要在第一次启动时,执行sql文件。
py3study
2020/04/24
5.5K0
Docker(43)- 安装 Mysql,数据持久化
思考 MySQL的数据持久化的问题 搜索 mysql 镜像 docker search docker 官方镜像介绍地址 https://hub.docker.com/_/mysql?tab=descr
小菠萝测试笔记
2021/10/18
1.7K0
基于docker的mysql安装及配置
通常我们也应该这样做,将业务数据保存到宿主机,避免容器删除后丢失数据,而且也可以做有效备份
飞奔去旅行
2019/06/13
1.3K0
Docker + MySQL 主从环境搭建
my.cnf(部分老版本可能是my.ini)是MySQL核心配置文件。首先,在任意挂载目录下新建*.cnf文件(这里的*代表可以是任意的文件名称)。如果你的mysql是下载安装的,请找到my.cnf并参考如下配置:
happyJared
2018/09/20
1.4K0
Docker + MySQL 主从环境搭建
docker创建Redis、MySQL和Nginx
备注,“redis-server /etc/redis/redis.conf”可能不成功,因为配置文件中指定了各种文件路径,而容器中可能不存在路径,可以先启动容器,再进入容器中重启Redis:
CoderJia
2024/10/18
1200
【实践】13.DOCKER之Docker Compose实战 WordPress
docker-compose.yml文件将开启一个 wordpress 服务和一个独立的 MySQL 实例:
辉哥
2021/06/08
5670
【实践】13.DOCKER之Docker Compose实战 WordPress
Docker安装MySQL 8.0过程记录
2. 启动docker         # systemctl start docker
星哥玩云
2022/08/17
1.6K0
Docker系列之MySQL安装教程
有了前面的基础教程Docker系列之常用命令操作手册之后,本博客记录一篇mysql的安装教程
SmileNicky
2020/01/13
6080
Docker系列之MySQL安装教程
在alpine中运行mysql
搬瓦工的1G内存,想要跑一个MySQL服务,动辄500M内存就没了,剩下一半的内存让我感觉很虚,于是想把是不是把MySQL塞进alpine镜像中看看,结果一搜,果然已经有大神这样做了,使用的是MariaDB,测试下来,同样跑一个博客只需要50M内存就OK,简直完美!
老高的技术博客
2022/12/28
3.9K0
Docker下的mysql设置字符集
如果用Springboot的JPA starter访问此数据库,由于数据库没有设置字符集,springboot应用会抛出以下异常:
程序员欣宸
2022/05/09
1.6K0
Docker下安装MySQL
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。上面把宿主机的 /home/xxljobwork 目录挂载到容器的 /home/xxljobwork 目录.
BUG弄潮儿
2021/03/22
1K0
测试开发进阶(四十五)
https://github.com/zx490336534/ApiTest/tree/master/DeployApiTest
zx钟
2019/12/11
6450
测试开发进阶(四十五)
相关推荐
告诉你最简单的方式搭建MySQL、Redis、MongoDB数据库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档