mysql表上亿数据进行删除
我的场景: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表行锁的问题,运行也稳定不会出错,效率也是最高的
CREATE DEFINER=`root`@`%` PROCEDURE `clean_old_defectData`() BEGIN #Routine body goes here... DECLARE COILNO VARCHAR(255); DECLARE COILNO_CURSOR_COUNT INT DEFAULT 1; -- 先查出删除条件 in 里面的值(我的是DELIVERYCOILNO),放到游标里 DECLARE COILNO_CURSOR CURSOR FOR SELECT DELIVERYCOILNO FROM qualitydb.t_sg_mat_info WHERE STARTTIME BETWEEN 2021-01-01 AND 2021-07-01; -- 设置循环的次数(游标的大小) DECLARE EXIT HANDLER FOR NOT FOUND SET COILNO_CURSOR_COUNT = 0; OPEN COILNO_CURSOR; -- 循环游标 WHILE COILNO_CURSOR_COUNT <> 0 DO FETCH COILNO_CURSOR INTO COILNO; -- INSERT INTO qualitydb.test(val2) VALUES(COILNO); -- 删除表数据,我这里有两个表要删除 DELETE FROM qualitydb.t_sg_defect_info WHERE DELIVERYCOILNO = COILNO; DELETE FROM qualitydb.t_sg_defect_quality_result WHERE coil_id = COILNO; END WHILE; CLOSE COILNO_CURSOR; END