问题-我们的表中有很多重复的行,这使得计算不准确
我尝试的解决方案-我编写了一个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/