首页 > 解决方案 > 删除 mysql 表上的重复项 [该表 > 2Gb]

问题描述

问题- 我们的表中有许多重复的行,这使得计算不准确

我尝试过的解决方案- 我写了一个删除内部连接查询,该查询将删除重复项(根据我的研究,这是最快的方法),在 staging 上对其进行了测试并且它有效,在生产中运行,希望它最多能持续 1-2 天,

这是我使用的查询:

DELETE t1 FROM table t1
    INNER JOIN
table t2 
WHERE t1.id > t2.id 
AND t1.col1 = t2.col1
AND t1.col2 = t2.col2
AND t1.col3 = t2.col3
AND t1.col4 = t2.col4

解决方案的问题-

我预计查询会运行几个小时或 2-3 天,但是当我尝试整个表的这个解决方案时,它花了 4 天时间,它仍然在运行,我不得不终止这个过程。

查询已经运行了 4 天,它仍然在运行,我尝试了一个较小的表,它是我原始表的一部分,但又花了几个小时。我无法在我的表上运行数周的查询,因为我在这张表上进行了大量计算并且我不希望我的表被锁定。

标签: mysqlsqlduplicates

解决方案


从表中删除大量行非常昂贵。我建议使用您想要的行创建一个新表,然后(也许)重新填充原始表。

你可以从:

CREATE TABLE temp_t AS
    SELECT t1.*
    FROM t t1
    WHERE t1.id = (SELECT MIN(t2.id)
                   FROM t t2
                   WHERE t2.col1 = t2.col1 AND
                         t2.col2 = t2.col2 AND
                         t2.col3 = t2.col3 AND
                         t2.col4 = t2.col4
                  );

为了在合理的时间内工作,您需要一个索引t(col1, col2, col3, col4)!该索引非常重要(可能需要一些时间来构建)。

然后,您可以决定是否要重新填充原始表。如果您已验证上述内容正确,则可以执行以下操作:

truncate table t;

insert into t
    select * from temp_t;

当然,你应该在做这样的事情之前备份你的表/数据库。


推荐阅读