首页 > 解决方案 > 如何删除两个大表的析取行?

问题描述

表 products1:30 mio 行表 products2:100 mio 行

两个表不同,但共享一个共同的唯一索引:

create table products1(
    ...
    UNIQUE KEY uniq_products (name, manufacture, releasedate,... <a total of 10 fields> )
)

我想从 table1 中删除所有行,其唯一索引不会出现在 table2 中。

我开始如下:

DELETE FROM products1 p1 WHERE NOT EXISTS (
    SELECT 1 FROM products2 p2 WHERE p1.name = p2.name, p1.manufacture = p2.manufacture, ...
)

问题:这是一般的正确方法吗?由于数据集很大,如何加快这样的查询?

标签: mysqlsql

解决方案


delete似乎做了你想做的事,假设这,真的意味着AND. 这是一个合理的查询。

对于此查询:

DELETE p1 FROM products1 p1
     WHERE NOT EXISTS (SELECT 1
                       FROM products2 p2
                       WHERE p1.name = p2.name AND
                             p1.manufacture = p2.manufacture AND
                      );

您需要比较键上的索引: products2(name, manufacture, . . . ). 如果 10 个键的组合被声明为唯一并且您正在使用所有 10 列进行相等比较,则您已经拥有此索引。

请注意,如果您要删除大量行(数十万或更多),那么开销delete将对性能产生很大影响。您可能想要创建一个包含所需行的新表(基本上基于上述逻辑)。然后截断原始表并重新插入行。


推荐阅读