当前位置: 首页 > news >正文

MySQL批量删除海量数据怎么操作

一、删除大表的部分数据

一个表有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分钟。对比之前的八个小时,大大节省了时间。

以上做法的意思是:

1、先删除索引

2、删除不需要的数据

3、创建索引

三、表的删除复习

在删除数据的时候根据不同的场景使用不同的方法,比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增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、然后重新创建索引。

http://www.jsqmd.com/news/1107647/

相关文章:

  • IDEA代码折叠实战手册(2024最新版):从基础折叠到自定义区域,JetBrains官方未公开的12个高级技巧
  • 2026原木松木桩定制指南:厂家直供更省心
  • 5分钟掌握ImDisk:Windows虚拟磁盘的魔法工具箱 [特殊字符]
  • 告别网络依赖!国家中小学智慧教育平台电子课本离线下载终极指南
  • 为什么你的IDEA大纲视图总为空?,87%的Java工程师踩过的4个配置陷阱及一键修复方案
  • PPTist:免费在线PPT制作工具的完整指南,告别Office依赖
  • 手把手教你怎么安装Bruker DataAnalysis 4.4 质谱数据处理软件下载安装教程
  • 【计算机毕业设计案例】于 SpringBoot 的便民医疗用品网购服务系统的设计与实现(程序+文档+讲解+定制)
  • 2021 AI技术落地五大突破:多模态、AIGC、医疗可信AI与工程化实践
  • 怎样从零开始玩转AI视频生成:3个秘诀让你轻松创作专业级短视频
  • 出海企业如何应对SBTi 2.0?范围三强制核查下的供应链合规战
  • 科研工作者如何用3个步骤建立高效的知识管理系统
  • C++移动语义
  • 图解人工智能(73)人工智能前沿-预测化学反应分类
  • 【紧急修复必备】IDEA Git历史回滚黄金法则:3类不可逆操作预警+4种安全回滚路径(含可视化操作图谱)
  • OpenMP并行编程优化与性能调优实践
  • 运营商领域全生命周期数据安全合规管控技术落地实践与格局梳理
  • AI生成多页面原型实战:APP与B端后台的生成效果与流程拆解
  • 电子电路与PCBA:从概念到可制造组装
  • 大模型Agent开发:从原理到实战的必备指南
  • 微信支付V3平台证书切换公钥验签:从“无可用证书”到Base64解码错误的实战解决方案
  • 私域直播SaaS横向测评:保利威、诺云、悦邻,谁更懂“社区门店”的生意逻辑?
  • 仿小红书源码架构解析,瀑布流、Redis缓存、搜索与WebSocket消息设计
  • Linux deb 安装包转 rpm 安装包
  • 如何高效使用抖音无水印下载工具:专业用户的完整方案指南
  • 跨区公有云节点 DNS 解析故障排查与自动化修复记录
  • 【Git Diff可视化权威标准】:基于JetBrains官方API文档逆向验证的12项IDEA差异比对最佳实践
  • 国家中小学智慧教育平台电子课本下载器:三步获取PDF教材的完整方案
  • STM32F411RE键盘扩展方案:74HC32实现16功能输入
  • 【Spring Boot项目结构黄金标准】:20年架构师亲授5大不可违背的模块划分铁律