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

我尝试的解决方案-我编写了一个delete内部联接查询,该查询将删除重复项(根据我的研究,这是最快的方法),在登台阶段对其进行了测试,并且可以正常工作,并在生产环境中运行,希望可以持续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天,并且仍在运行,我尝试在一个较小的表上进行查询,该表是原始表的一部分,并且又花了几个小时。我无法在我的表上运行数周的查询,因为我正在对该表进行大量计算,并且我不希望我的表被锁定。

最佳答案

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

您可以从以下内容开始:

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;


当然,您应该在执行此类操作之前备份表/数据库。

关于mysql - 删除mysql表上的重复项[该表> 2Gb],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57990238/

10-08 20:45