广告
返回顶部
首页 > 资讯 > 数据库 >Mysql在大表中删除大量数据的优化
  • 128
分享到

Mysql在大表中删除大量数据的优化

mysql数据库sql 2023-09-01 05:09:49 128人浏览 独家记忆
摘要

假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。 如果直接使用delete from tab_name where status=1; 会触发lock wa

假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。

如果直接使用delete from tab_name where status=1; 会触发lock wait timeout exceed的错误,因为这条语句涉及的记录数太多。

1、drop、truncate和delete的区别:

drop

truncate

delete

执行过程

DDL语句,删除整张表和表结构,以及表的索引、约束和触发器。

DDL语句,只删除表数据,表的结构、索引、约束等会被保留。

DML语句,删除表中数据

回滚

不可

不可

可以

事务

不走事务,不会表,也不会生产大量日志写入日志文件;

truncate table table_name 后立刻释放磁盘空间,并重置auto_increment的值。

事务会记录到日志,并且有行、表锁;

delete删除不释放磁盘空间,但后续insert会覆盖在之前删除的数据上。

执行效率:drop > truncate > delete

2、分批limit删除方案:

DELETE FROM tab_name WHERE status=1 ORDER BY status LIMIT 10000;

注意:当需要用到order by排序时,必须order by + limit联用,否则order by 就会被优化器优化掉,被认为无意义。

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

1)加limit的的优点:

  1. 降低写错sql的代价,就算删错了,比如limit 500,那也就丢了500条数据,并不致命,通过binlog也可以很快恢复数据。
  2. 避免了长事务,delete执行时Mysql会将所有涉及的行加写锁和Gap锁(间隙锁),所有DML语句执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
  3. delete数据量大时,不加limit容易把cpu打满,导致越删越慢。

针对上述第二点,前提是statusid上加了索引,大家都知道,加锁都是基于索引的,如果statusid字段没索引,就会扫描到主键索引上,那么就算statusid = 1 的只有一条记录,也会锁表。

2)单条删除、更新操作,使用limit1绝对是个好习惯:

单条更新和删除操作时,如果SQL中有limit 1;这时就return了,否则还会执行完全表扫描才return。效率不言而喻。

 3、rename方案:

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

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

删除大表的多行数据时,会超出innod block table size的限制,最小化的减少锁表的时间的方案是:

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

INSERT INTO t_copy SELECT * FROM t WHERE ... ;

2)利用rename原子操作,重命名原始表和复制表

RENAME TABLE t TO t_old, t_copy TO t;

3)删掉原始表

DROP TABLE t_old;

4、删除不必要的索引后重建

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

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

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

来源地址:https://blog.csdn.net/liuxiao723846/article/details/130360635

您可能感兴趣的文档:

--结束END--

本文标题: Mysql在大表中删除大量数据的优化

本文链接: https://www.lsjlt.com/news/387566.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql在大表中删除大量数据的优化
    假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。 如果直接使用delete from tab_name where status=1; 会触发lock wa...
    99+
    2023-09-01
    mysql 数据库 sql
  • MySQL 删除数据 批量删除(大量)数据
    在删除数据的时候根据不同的场景使用不同的方法,比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增ID、批量删除大量数据等,可以使用delete、truncate、drop等语句。 一、方法分类 二、具体方法 类型语句删...
    99+
    2023-08-30
    mysql 数据库 java
  • mysql 大表批量删除大量数据的实现方法
    问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业...
    99+
    2022-05-11
    mysql 大表批量删除 mysql 大表批量
  • mysql删除大量数据会不会锁表
    MySQL在删除大量数据时会进行锁表操作,这可能会导致其他查询或写操作被阻塞,从而影响数据库的性能和吞吐量。 具体来说,MySQL在...
    99+
    2023-10-23
    mysql
  • MySQL - 单表数据量大表优化方案
    一. 前言 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化。 二. 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种...
    99+
    2023-09-30
    mysql 数据库
  • mysql快捷删除大量数据的方法
    这篇文章主要介绍了mysql快捷删除大量数据的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql捷删除大量数据的方法:首先创建临时表,...
    99+
    2022-10-18
  • MongoDB中如何优雅地删除大量数据
    删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求。除了正常的业务需求,我们需要通过这种方式来为数据库“瘦身”。 为什么要“瘦身”呢? 表的数据量到达一定量级后,数据量越大,表的查询性能会越差。 毕竟数据量越大,B+树的层级会越...
    99+
    2017-11-11
    MongoDB中如何优雅地删除大量数据
  • MongoDB中优雅删除大量数据的三种方式
    目录为什么要“瘦身”呢?MongoDB中删除数据的三种方式三种方式的执行效率对比1. remove2. deleteMany3. bulkWrite通过 Write Concern ...
    99+
    2022-11-12
  • Mysql大数据量分页优化
    Mysql大数据量分页优化 参考文章: MySQL百万级数据量分页查询方法及其优化 MySQL分页查询优化     重点提一下: 在优化分页语句过程中,一定注意查询的语句添加排序字段,一定自己建表实践,...
    99+
    2021-09-09
    Mysql大数据量分页优化
  • MySQL数据量大如何优化
    优化MySQL的方法主要有以下几种:1. 确保适当的索引:索引可以大大加快查询速度,因此在数据库设计时要确保为常用的查询字段添加适当...
    99+
    2023-10-08
    MySQL
  • 大数据量删除的思考 - 2
        在这个简短系列的第1部分中,我提供了两个场景的非正式描述,在这些场景中,我们可以从表中进行大规模删除。没有一个具体的例子,很难想象删除数据的性质和可用的访问...
    99+
    2022-10-18
  • 大数据量删除的思考(四)
    在本系列的前一期文章中,我制作了一些图,突出显示了按表扫描执行大量删除操作和按索 引范围扫描执行大量删除之间的主要区别。 根据所涉及的数据模式,选择正确的策略可能对随机I/Os 的数量、生成的undo的数...
    99+
    2022-10-18
  • 大数据量删除的思考 - 1
        在最近一篇关于从表中删除列的文章里,我留下了一个悬而未决的问题,删除列之后你应该/可能会做什么?因为删除列只不过是“大量删除”的特殊情况。在这篇文章中,我计...
    99+
    2022-10-18
  • 大数据量删除的思考(二)
    在这个简短系列的第1部分中,我提供了两个场景的非正式描述,在这些场景中,我们可以从表中进行大规模删除。没有一个具体的例子,很难想象删除数据的性质和可用的访问路径会产生大数据量删除操作对系统的性能影响...
    99+
    2022-10-18
  • 数据库大数据量删除的分析
    这篇文章主要介绍“数据库大数据量删除的分析”,在日常操作中,相信很多人在数据库大数据量删除的分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库大数据量删除的分析”的疑惑...
    99+
    2022-10-18
  • mysql 关于大数据量日志表的优化过程
    我们知道很多网站都会有关于记录网站搜索的日志表,用于记录会员的基本登录信息,用于后期数据分析或者防攻击使用,现在我们有一张表logs,每天产生大概60万的数据。 ...
    99+
    2022-10-18
  • 浅谈MySQL如何优雅的做大表删除
    随着时间的推移或者业务量的增长,数据库空间使用率也不断的呈稳定上升状态,当数据库空间将要达到瓶颈的时候,可能我们才会发现数据库有那么一两张的超级大表!他们堆积了从业务开始到现在的全部数据,但是90%的数据都是没有业务...
    99+
    2022-05-18
    MySQL 大表删除
  • Innodb中mysql如何删除2T的大表
    这篇文章给大家分享的是有关Innodb中mysql如何删除2T的大表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。假设,你有一个表erp,如果你直接进行下面的命令drop&nbs...
    99+
    2022-10-18
  • MySQL如何优雅的删除大表实例详解
    前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住了,外在表现就是Q...
    99+
    2022-05-11
    mysql 删除大表 mysql删除表的字段 mysql删除表内的数据语句
  • MySQL中怎么有效的删除一个大表
    MySQL中怎么有效的删除一个大表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在MySQL中如何有效的删除一个大表? 在DR...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作