很慢 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.
检查每一行
所以我试图从相当大的 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.
检查每一行