我想查询一个SELECT基于某些过滤器的某些条目,然后DELETE s它们的查询。

这通常和SELECT * FROM sometable WHERE foo = bar; DELETE * FROM sometable WHERE foo = bar;一样容易。但是,我正在处理非常大的表,因此非常关注性能问题。因此,我只想遍历一个表,并且对于选中的每一行,也要删除该行(上面的查询遍历了该表两次:对SELECT一次,对DELETE一次)。

这可能吗?

最佳答案

如果要处理非常大的表,建议您按块(使用限制)检索行并按主键排序,然后使用“ in子句”中的主键运行删除操作

这样,当您删除行时,您将不会锁定您的其他人并降低服务器的速度。

在您获取代码的同时循环运行它们

SELECT * FROM sometable
    WHERE foo = bar
    AND  your_primary_key > last_checked_value
    ORDER BY your_primary_key  limit 100;


DELETE from sometable
    WHERE  your_primary_key
    IN (value1,value2,...,...,value100);

09-26 11:44