当删除数据量过大事,为了防止删除过程锁表,影响正常程序。当删除数据超过100w,我们使用存储过程,分批删除数据。
删除方法一:根据删除条件删除,这种效率不高。
DROP PROCEDURE IF EXISTS SompDeleteProc1
DELIMITER $$
CREATE DEFINER = CURRENT_USER PROCEDURE SompDeleteProc1()
BEGIN
-- 定义变量
DECLARE num int;
--REPEAT循环语句开始
REPEAT
DELETE from tab1 where code<'10051645' LIMIT 3000;
set num=ROW_COUNT();
COMMIT;
--UTILE后面条件成立就退出循环
UNTIL num=0
END REPEAT;
END $$
DELIMITER ;
CALL SompDeleteProc1;
删除方法二:全表遍历,根据自增ID,每次删除一个区间段。这种速度更加快
DELIMITER $$
CREATE DEFINER = CURRENT_USER PROCEDURE McmpDeleteProc1()
BEGIN
--declare用于定义局部变量
declare minV BIGINT ;
declare maxV BIGINT ;
--取出最小的申请编码
select id into minV from t_cm1 order by id limit 1;
--取出最大的申请编码
select id into maxV from t_cm1 order by id desc limit 1;
--最大编码加1W
set maxV = maxV + 10000;
--如果最小编码小于等于最大编码继续执行,每次删除5000
while minV <= maxV
do
delete from t_cm1 where CODE >=70885853 AND CODE <=70898813 and id >=minV and id < minV + 5000 ;
COMMIT;
set minV = minV + 5000;
end while;
END $$
DELIMITER ;
删除数据后清磁盘,释放表空间: alter table t_table1 engine = innodb ;