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表行锁的问题,运行也稳定不会出错,效率也是最高的

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

你可能感兴趣的:(mysql,数据库,java,存储过程)