我需要从 MySQL 中的大型 INNODB 表中删除大量行。
表中有数百万行,这个语句可能需要几分钟,也许几个小时。
我尝试过这个存储过程但没有成功,因为循环中的 SQL 语法有错误。
如何从大表中删除大量行?
BEGIN
Set @a = SELECT MIN(sId) FROM doTable;
LOOP
SELECT @z := sId FROM doTable WHERE sId >= @a ORDER BY sId LIMIT 1000,1;
If @z is null
exit LOOP
DELETE FROM doTable
WHERE sId >= @a
AND sId < @z
AND sType IS NULL
SET @a = @z
sleep 3
ENDLOOP
DELETE FROM doTable
WHERE sId >= @a
AND sType IS NULL;
END
最佳答案
这是一个工作示例,添加了 sleep ,很好:
DROP PROCEDURE IF EXISTS clean_someTable;
DELIMITER $$
CREATE PROCEDURE clean_someTable()
BEGIN
REPEAT
DO SLEEP(1);
DELETE FROM someTable
WHERE (created_at < NOW() - INTERVAL 1 MONTH)
ORDER BY primary_key_id
LIMIT 10000;
UNTIL ROW_COUNT() = 0 END REPEAT;
END$$
DELIMITER ;
CALL clean_someTable();
关于MySQL 大删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260968/