所以我试图从相当大的mysql(innodb)表中删除许多行。
我要使用的查询如下:
delete from item where id in (select id from items_to_be_deleted);
item
是70'000'000行表,而items_to_be_deleted
是1'000'000行表。
我的查询似乎永远也不会完成,即使我给它添加了一个非常小的限制。 (delete from item where id in (select id from items_to_be_deleted) LIMIT 10;
如果我运行select id from items_to_be_deleted
,它将几乎立即返回,它只是一个具有主键(id)和另一个varchar字段的表。
我的查询有什么问题,它花费了很长时间/似乎从未完成?
答案 0 :(得分:3)
IN子句作为OR子句的迭代,因此您可以使用基于用于IN子句的子查询的内部联接来避免这种情况
delete item
from item
inner join (
select id
from items_to_be_deleted
) t on t.id = item.id
答案 1 :(得分:2)
JOIN
怎么样?
DELETE i
FROM Item i
INNER JOIN items_to_be_deleted i2 ON i.ID = i2.ID
答案 2 :(得分:1)
其他方法可以是对依赖子查询使用EXISTS运算符:
DELETE i FROM item i
WHERE EXISTS (
SELECT 1 FROM items_to_be_deleted WHERE id = i.id
)
答案 3 :(得分:0)
删除一百万行时,请分块执行。否则,撤消日志的构建将成为杀手er。它必须保存所有前一百万行,然后再将其扔掉。
由于它只占表的一小部分,因此我不建议将要保留的行复制到新表中。
快速制作DELETE
的多种方法:http://localhost/rjweb/mysql/doc.php/deletebig
要尝试实现的一件事,因为每1个折腾要保留69行:尝试让1M行表驱动查询。大多数解决方案都涉及扫描所有70M行,并对照较小的表进行检查。