• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    mysql 大表批量删除大量数据的实现方法

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

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

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

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

    解决方案

    我们很容易想到,在 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;

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

    到此这篇关于mysql 大表批量删除大量数据的实现方法的文章就介绍到这了,更多相关mysql 大表批量删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MyBatis批量插入/修改/删除MySql数据
    • mysql利用mysqlbinlog命令恢复误删除数据的实现
    • mysql5.7.33误删除ibdata文件找回数据的方法
    • mysql数据库删除重复数据只保留一条方法实例
    • 浅谈为什么MySQL不建议delete删除数据
    • Python批量删除mysql中千万级大量数据的脚本分享
    • Mysql删除数据以及数据表的方法实例
    • MySQL删除数据,表文件大小依然没变的原因
    • MySQL 快速删除大量数据(千万级别)的几种实践方案详解
    • MySQL Delete 删数据后磁盘空间未释放的原因
    上一篇:MySQL 搭建MHA架构部署的步骤
    下一篇:MYSQL字符集设置的方法详解(终端的字符集)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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