• MySQL单表数据量超1亿,根据 索引列 批量删除数据


    我的场景:MySQL8有个表数据量超1亿,然后我要根据某个例(一对多)删除数据,

    我直接用:delete from 表 where 字段 in (select 其他表)     条件用in的方式执行报错

    [Err] 1206 - The total number of locks exceeds the lock table size

    因为一次性要删除数据量太多了,每个都加了行锁,所以报错了,而且这样效率也不高,不稳定。

    所以写了个存储过程的方式来删除数据:

    概述:

    1.先查出删除条件 in 的范围值

    2.将in值存储到游标,然后一个一个循环

    3.根据循环值 删除表数据(一对多,索引列)

     

    这样不是一次性删除,不用担心mysql表行锁的问题,运行也稳定不会出错,效率也是最高的

    1. CREATE DEFINER=`root`@`%` PROCEDURE `clean_old_defectData`()
    2. BEGIN
    3. #Routine body goes here...
    4. DECLARE COILNO VARCHAR(255);
    5. DECLARE COILNO_CURSOR_COUNT INT DEFAULT 1;
    6. -- 先查出删除条件 in 里面的值(我的是DELIVERYCOILNO),放到游标里
    7. DECLARE COILNO_CURSOR CURSOR FOR
    8. SELECT DELIVERYCOILNO FROM qualitydb.t_sg_mat_info WHERE STARTTIME BETWEEN '2021-01-01' AND '2021-07-01';
    9. -- 设置循环的次数(游标的大小)
    10. DECLARE EXIT HANDLER FOR NOT FOUND SET COILNO_CURSOR_COUNT = 0;
    11. OPEN COILNO_CURSOR;
    12. -- 循环游标
    13. WHILE COILNO_CURSOR_COUNT <> 0 DO
    14. FETCH COILNO_CURSOR INTO COILNO;
    15. -- INSERT INTO qualitydb.test(val2) VALUES(COILNO);
    16. -- 删除表数据,我这里有两个表要删除
    17. DELETE FROM qualitydb.t_sg_defect_info WHERE DELIVERYCOILNO = COILNO;
    18. DELETE FROM qualitydb.t_sg_defect_quality_result WHERE coil_id = COILNO;
    19. END WHILE;
    20. CLOSE COILNO_CURSOR;
    21. END

  • 相关阅读:
    Java框架 SpringMVC--域对象共享数据
    【前端精进之路】JS篇:第1期 数据类型总结
    npm 包管理
    解码拼控设备IP地址忘记如何找回
    《痞子衡嵌入式半月刊》 第 98 期
    PostgreSQL 与 Oracle 访问分区表执行计划差异
    数据存储(二)WebStorage 之 IndexedDB
    【深度学习】 自编码器(AutoEncoder)
    Python实现喷泉粒子系统(Win11)
    jsonata工具查询JSON和转换
  • 原文地址:https://blog.csdn.net/qq_43082438/article/details/125501965