mysql 大表批量删除大量数据的实现方法

作者:干货满满张哈希 时间:2024-01-22 10:28:34 

问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量差不多占50%,根据条件把个体户的行都删掉。请问如何操作?答案为个人原创

假设表的引擎是 Innodb, MySQL 5.7+

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

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

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

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

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

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

解决方案

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

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


alter table 你的表 engine=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;

注意这句话其实就是重建你的表,虽然你的表的引擎已经是 innodb 了,加上后面的, ALGORITHM=INPLACE, LOCK=NONE 可以不用锁表就重建表。

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


create trigger person_trigger_update AFTER UPDATE on 原有表 for each row
begin set @x = "trigger UPDATE";
Replace into 新表 SELECT * from 原有表 where 新表.id = 原有表.id;
END IF;
end;

这样可以保证线上业务有新数据会同步。之后,将所有企业类型的数据,插入新表,同时如果已存在则证明发生了更新同步就不插入。个体户数据由于业务变化,并不在这个表上更新,所以这样通过了无表锁同步实现了大表的数据清理

来源:https://blog.csdn.net/zhxdick/article/details/112798605

标签:mysql,大表,批量,删除
0
投稿

猜你喜欢

  • python实现数据分析与建模

    2023-07-03 02:21:38
  • php 模拟get_headers函数的代码示例

    2023-09-09 06:16:36
  • keras实现VGG16 CIFAR10数据集方式

    2023-08-19 08:27:08
  • Python字符串、整数、和浮点型数相互转换实例

    2023-09-20 18:05:52
  • 如何在sae中设置django,让sae的工作环境跟本地python环境一致

    2022-03-09 22:04:54
  • python通过opencv调用摄像头操作实例分析

    2023-03-09 14:32:04
  • WebSocket部署到服务器出现连接失败问题的分析与解决

    2023-08-15 22:43:21
  • python面向对象 反射原理解析

    2021-05-14 08:56:32
  • 教你如何用Python实现人脸识别(含源代码)

    2021-03-14 23:33:03
  • python中的编码和解码及\\x和\\u问题

    2023-11-02 14:46:31
  • PyQt5+Pycharm安装和配置图文教程详解

    2022-12-20 08:50:26
  • 深度剖析Golang中的数组,字符串和切片

    2024-02-17 08:53:13
  • BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)

    2024-04-18 09:39:33
  • python http服务flask架构实用代码详解分析

    2023-07-31 13:52:59
  • Golang中HttpRouter路由的使用详解

    2024-04-30 10:04:23
  • 总结Python编程中函数的使用要点

    2021-03-15 01:49:52
  • 关于vue3默认把所有onSomething当作v-on事件绑定的思考

    2024-05-22 10:41:34
  • windows下Mysql多实例部署的操作方法

    2024-01-19 16:33:11
  • sqlserver数据库优化解析(图文剖析)

    2024-01-17 08:55:37
  • python os模块简单应用示例

    2021-12-20 13:36:48
  • asp之家 网络编程 m.aspxhome.com