mysql - 删除 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 天,它仍然在运行,我尝试了一个较小的表,它是我原始表的一部分,但又花了几个小时。我无法在我的表上运行数周的查询,因为我在这张表上进行了大量计算并且我不希望我的表被锁定。
解决方案
从表中删除大量行非常昂贵。我建议使用您想要的行创建一个新表,然后(也许)重新填充原始表。
你可以从:
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;
当然,你应该在做这样的事情之前备份你的表/数据库。
推荐阅读
- python-3.x - 计算置信区间 - Bootstap
- jenkins - 从 Jenkins 上传的 JRXML 提供 HTTP-500,但在其他地方也可以使用
- unity3d - 将颜色应用到具有材料颜色的文本
- drake - Pydrake:访问额外的 SNOPT 求解器输出 (iter)
- elasticsearch - Elasticsearch 内联字符串替换似乎什么都不做
- javascript - 加载页面而不从 devtools 中刷新窗口对象
- django-rest-framework - 为什么 UpdateAPIView 视图在更新时抛出错误?
- c++ - C++ 自定义异常类
- pandas - 删除 Pandas 中列子集为空的行
- sql - pgsql:如何将 Array_to_string 放入 COALESCE