我想查询一个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);