首页 > 数据库 >mysql如何批量删除海量数据

mysql如何批量删除海量数据

时间:2024-11-17 17:44:23浏览次数:3  
标签:批量 删除 海量 表名 索引 mysql table 数据 delete

一、删除大表的部分数据

一个表有1亿6000万的数据,有一个自增ID。最大值就是1亿6000万,需要删除大于250万以后的数据,有什么办法可以快速删除?

看到mysql文档有一种解决方案:http://dev.mysql.com/doc/refman/5.0/en/delete.html

If you are deleting many rows from a large table, you may exceed the lock table size for an InnoDB table. To avoid this problem, or simply to minimize the time that the table remains locked, the following strategy (which does not use DELETE at all) might be helpful:

Select the rows not to be deleted into an empty table that has the same structure as the original table:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;

Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
RENAME TABLE t TO t_old, t_copy TO t;

Drop the original table:
DROP TABLE t_old;

删除大表的多行数据时,会超出innod block table size的限制,最小化的减少锁表的时间的方案是:
1、选择不需要删除的数据,并把它们存在一张相同结构的空表里
2、重命名原始表,并给新表命名为原始表的原始表名
3、删掉原始表

二、删除带索引的表


在My SQL数据库使用中,有的表存储数据量比较大,达到每天三百万条记录左右,此表中建立了三个索引,这些索引都是必须的,其他程序要使用。由于要求此表中的数据只保留当天的数据,所以每当在凌晨的某一时刻当其他程序处理完其中的数据后要删除该表中昨天以及以前的数据,使用delete删除表中的上百万条记录时,MySQL删除速度非常缓慢,每一万条记录需要大概4分钟左右,这样删除所有无用数据要达到八个小时以上,这是难以接受的。
 

查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的,于是删除掉其中的两个索引后测试,发现此时删除速度相当快,一百万条记录在一分钟多一些,可是这两个索引其他模块在每天一次的数据整理中还要使用,于是想到了一个折中的办法:

在删除数据之前删除这两个索引,此时需要三分钟多一些,然后删除其中无用数据,此过程需要不到两分钟,删除完成后重新创建索引,因为此时数据库中的数据相对较少,约三四十万条记录(此表中的数据每小时会增加约十万条),创建索引也非常快,约十分钟左右。这样整个删除过程只需要约15分钟。对比之前的八个小时,大大节省了时间。

三、表的删除复习

删除数据的时候根据不同的场景使用不同的方法,比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增ID、批量删除大量数据等,可以使用delete、truncate、drop等语句

批量删除

1) 批量删除少量数据

delete from 表名 where key in(值1,...,值n);

1、先确定需要删除数据的主键或者条件;

2、利用主键删除记录。

2) 分批删除小批量数据

如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:

1、delete from 表名 where 条件 limit 10000;

2、在一个连接中循环执行 20 次 delete from 表名 limit 500;

3、在 20 个连接中同时执行 delete from 表名 limit 500。

三种方法的比较

1、一次占用锁的时间比较长,可能导致其他客户端一致等待资源。

2、分多次占用锁,串行化执行,不占有锁的间隙,其他客户端可以工作。

3、自己制造锁竞争,加剧并发。可能锁住同一记录导致死锁的可能性增大。

注意:

执行大批量删除的时候最好使用limit,否则很有可能造成死锁。

如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据。

如果需要删除的数据远远大于不用删除的数据

1、先选择不需要删除的数据,并把它们存在一张相同结构的空表里;

2、再重命名原始表,并给新表命名为原始表的原始表名;

3、然后删掉原始表。

如果需要删除超大批量数据

1、先删除表中索引;

2、再删除需要删除的数据;

3、然后重新创建索引。

标签:批量,删除,海量,表名,索引,mysql,table,数据,delete
From: https://blog.csdn.net/GDDGHS_/article/details/143835729

相关文章

  • 批量提取当前文件夹pdf书籍目录
    importfitz#PyMuPDFimportpandasaspdimportos#获取当前文件夹中所有的PDF文件pdf_files=[fforfinos.listdir('.')iff.endswith('.pdf')]#提取目录信息的函数defextract_toc(toc,toc_list,level=0):foritemintoc:#确保目录项至少......
  • MySQL系统优化
    文章目录MySQL系统优化第一章:引言第二章:MySQL服务架构优化1.读写分离2.水平分区与垂直分区3.缓存策略第三章:MySQL配置优化1.内存分配优化BufferPool的优化查询缓存与表缓存KeyBuffer2.连接优化最大连接数会话超时连接池3.日志管理慢查询日志BinLog日志第......
  • (赠源码)基于Java Web+springboot+MySQL的Unishare闲置物品共享系统研究22945-计算机毕
    摘 要随着科技的快速迭代和人们环保意识的提高,共享经济逐渐成为社会发展的重要趋势。然而,在现实生活中,人们的消费水平大大提高,存在很多闲置物品无人问津,造成了一定的资源浪费和环境污染。与此同时,许多人需要使用这些闲置物品,却不知道如何获取。这种情况下,基于JavaWeb的Uni......
  • java+SSM+MySQL非遗传承背景下甘肃人文宣传网站051441-计算机毕设 原创(赠源码)
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对非遗传承背景下甘肃人文宣传网站等问题,对非遗传承背景下甘肃人文宣传网站进行研究分析,然后开......
  • 基于java+SSM+mysql的创业发布众筹系统设计与实现37145-计算机定制原创毕设选题推荐(免
    摘 要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设创业发布众筹系统。本设计主要实现集人性化、高效率、便捷等优点于一身的创业发布......
  • 基于Java+Vue+MySQL的青少年信息学奥林匹克竞赛交流平台设计与实现(精选毕业设计-可设
    文章目录1.前言2.详细视频演示3.文档参考3.1论文参考3.2流程设计图3.3数据库表结构设计3.4系统测试部分4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.选题推荐毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10......
  • MySQL
    MySQLRDBMS术语数据库:数据库是一些关联表的集合数据表:表是数据的矩阵列:一列包含了相同类型的数据行:一行一组相关的数据冗余:存储两倍数据主键:主键是唯一的,可以用主键来查询数据外键:外键用于关联两个表复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引......
  • SQLite 和 MySQL语法区别
    SQLite和MySQL在SQL语法上有一些差异,这些差异主要体现在数据类型、函数、表和索引的管理等方面。以下是一些主要的不同之处:1.数据类型SQLite支持的数据类型包括:TEXT, INTEGER, REAL, BLOB。动态类型系统,允许在插入时自动转换数据类型。MySQL支持更丰富的数据类型......
  • 美团商家联系电话采集软件团购外卖信息批量提取器
    定义目标:明确需要采集的数据,如商家名称、地址、评分、销量等。分析页面结构:通过浏览器的开发者工具,分析美团团购或外卖页面的HTML结构,找出包含所需数据的标签。模拟用户请求:使用requests库模拟用户访问美团页面,可能需要处理登录、反爬虫机制(如Cookies、Headers、验证码等)。解析......
  • 记一次Mysql远程连接报错
    问题描述:Plugincachingsha2passwordcouldnotbeloaded:在wsl2用docker中拉取了mysql镜像,启动后想在win下的环境远程连接到docker中的mysql,报错了,报错如下所示搜寻了相关的资料发现,在拉下来的myslq版本是8.0+,caching_sha2_password是默认的身份验证插件,既然sqlyog无......