gpt4 book ai didi

mysql - 删除 mysql 表上的重复项 [表> 2Gb]

转载 作者:行者123 更新时间:2023-11-29 15:38:18 25 4
gpt4 key购买 nike

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

我尝试过的解决方案 - 我编写了一个删除内部联接查询,该查询将删除重复项(根据我的研究,这是最快的方法),在登台上对其进行了测试,并且它有效,在生产希望最多持续 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com