MySQL删除非常慢

时间:2019-06-19 13:37:39

标签: mysql innodb

所以我试图从相当大的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字段的表。

我的查询有什么问题,它花费了很长时间/似乎从未完成?

4 个答案:

答案 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行,并对照较小的表进行检查。