很慢 MySQL 删除

Very slow MySQL delete

所以我试图从相当大的 mysql(innodb)table 中删除一些行。

我尝试使用的查询如下:

delete from item where id in (select id from items_to_be_deleted);

item 是 70'000'000 行 table,items_to_be_deleted 是 1'000'000 行 table。

我的查询似乎从未完成,即使我给它添加了一个非常小的限制。 (delete from item where id in (select id from items_to_be_deleted) LIMIT 10;

如果我 运行 select id from items_to_be_deleted 它几乎是瞬间 returns ,它只是一个带有主键 (id) 和另一个 varchar 字段的 table。

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

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

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

JOIN怎么样?

DELETE i
FROM Item i
INNER JOIN items_to_be_deleted i2 ON i.ID = i2.ID

其他方法可以是对依赖子查询使用 EXISTS 运算符:

DELETE i FROM item i 
WHERE EXISTS (
   SELECT 1 FROM items_to_be_deleted WHERE id = i.id
)

删除一百万行时,分块进行。否则,undo log的构建将是一个杀手。一定要把前面的million行都存起来,以后真的要折腾了。

因为它只是 table 的一小部分,所以我不建议将要 keep 的行复制到新的 table。

快速 DELETE 的多种方法:http://localhost/rjweb/mysql/doc.php/deletebig

要尝试实现的一件事是,因为每 1 个要保留 69 行:尝试让 1M 行 table 驱动查询。大多数解决方案涉及扫描所有 7000 万行,根据较小的 table.

检查每一行