首页 > 解决方案 > 非常慢的 MySQL 删除

问题描述

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

我的查询有什么问题,它需要这么长时间/似乎永远不会完成?

标签: mysqlinnodb

解决方案


IN 子句作为 OR 子句的迭代,因此您可以使用基于用于 IN 子句的相同子查询的内部联接来避免这种情况

delete item
from item
inner join  (
  select id 
  from items_to_be_deleted
) t on t.id  = item.id 

推荐阅读