怎么在mysql中批量删除大量数据

  介绍

怎么在mysql中批量删除大量数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

首先锁住这条记录,数据原有的被废弃,记录头发生变化,主要是打上了删除标记,也就是原有的数据deleted_flag变成1,代表数据被删除。但是数据没有被清空,在新一行数据大小小于这一行的时候,可能会占用这一行。这样其实就是存储碎片。

之后,相关数据的索引需要更新,清除这些数据,并且,会产生对应的binlog与redolog日志。
如果删除的数据是大量的数据,则会:

<李>

如果不加限制则会由于需要更新大量数据,从而索引失效变成全扫描导致锁表,同时由于修改大量的索引,产生大量的日志,导致这个更新会有很长时间,锁表锁很长时间,期间这个表无法处理线上业务。

<李>

由于产生了大量binlog导致主从同步压力变大

<李>

由于标记删除产生了大量的存储碎片。由于mysql是按页加载数据,这些存储碎片不仅大量增加了随机读取的次数,并且让页命中率降低,导致页交换增多。

<李>

由于产生了大量日志,我们可以看到这张表的占用空间大大增高。

解决方案

我们很容易想的到,在删除后加上限制限制控制其数量,这个数量让他会走索引,从而不会锁整个表。

但是,存储碎片,主从同步,占用空间的问题并没有解决。可以在删除完成后,通过如下语句,重建表:

alter  table 你的表,引擎=InnoDB,算法=原地,锁=没有;

注意这句话其实就是重建你的表,虽然你的表的引擎已经是InnoDB了,加上后面的,算法=原地,锁=没有可以不用锁表就重建表。

还有一种方案是,新建一张同样结构的表,在原有表上加上触发器:

create  trigger  person_trigger_update  AFTER  UPDATE 提醒原有表,for  each  row    时间=begin  set  @x “trigger  UPDATE";   Replace  into 新表,SELECT  *,得到原有表,where 新表.id =,原有表.id;   最终获得;如果;   结束;

关于怎么在mysql中批量删除大量数据问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

怎么在mysql中批量删除大量数据