The*_*Guy 2 mysql delete batch-processing
我想清理我的一张有 400 万的表。所以我准备这个查询来清理它。但它抛出了一个错误,有人可以帮我解决这个问题吗?
DELIMITER $$
DROP PROCEDURE IF EXISTS archive_table $$
create procedure archive_table ()
set @min=(select min(dob) from test
where dob < DATE_SUB(CURDATE(), INTERVAL 30 day));
while @min is not null
begin
delete from test where dob = @min;
commit ;
select min(dob) from test
where dob > @min
and dob < DATE_SUB(CURDATE(), INTERVAL 30 day) );
END WHILE;
END$$
Run Code Online (Sandbox Code Playgroud)
错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
near 'while @min is not null
begin
delete from test where dob = @min;
commi' at line 1
Run Code Online (Sandbox Code Playgroud)
小智 5
这可能会做你想做的事。这是一种从非常大的表中删除旧行的方法,而不会给数据库带来像常规表那样多的负载DELETE
DROP PROCEDURE IF EXISTS archive_table;
DELIMITER $$
CREATE PROCEDURE archive_table()
BEGIN
REPEAT
DO SLEEP(1); ## Optional, to minimise contention
DELETE FROM test
WHERE dob < NOW() - INTERVAL 1 MONTH
ORDER BY primary_key
LIMIT 1000; ## 10000 also works, this is more conservative
UNTIL ROW_COUNT() = 0 END REPEAT;
END$$
DELIMITER ;
CALL archive_table();
Run Code Online (Sandbox Code Playgroud)