从表中分块删除

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)