我正在尝试从包含数百万行的表中删除重复的行。我要检查重复项的字段太长(它存储URL)以放置UNIQUE
索引。有没有办法快速删除重复项?
删除重复项的推荐方法:
DELETE t1 FROM table1 AS t1 JOIN table1 AS t2 ON t1.id>t2.id AND t1.name=t2.name;
似乎永远不会完成它的工作,但我想它可能只需要很多时间。
我在这里听到的一个想法是为索引和比较创建一个MD5
哈希列。这是推荐路线吗?如果是这样,我是否应截断此列以获取空间/速度考虑因素?
答案 0 :(得分:0)
哈希会给你一个你可以放置和索引的列,所以t1.Name = t2.Name将是一个便宜得多的t1.Hash = t2.Hash。 将哈希值添加到1,000,000条记录需要一段时间。
另一个选择,如果这是一个关闭将选择清除例如
之类的东西Where T1 >= 0 and T1 < 10000
Where T1 >= 10001 and T1 < 20000
等
答案 1 :(得分:0)
我可能没有想到这一点,但值得一试:
md5url
,并使用网址的md5填充(UPDATE table1 SET md5url = MD5(url)
md5url
上创建一个(非唯一)索引 - md5应足够短以便将您的陈述更改为:
DELETE t1
FROM table1 AS t1
JOIN table1 AS t2
ON t1.md5url = t2.md5url
AND t1.name=t2.name
AND t1.id>t2.id;
这样,JOIN条件主要用于索引。如果该索引列md5url适合,那么我们实际检查URL - 因为,根据您拥有的网址数量,有可能在某些时候,两个URL 可能具有相同的MD5。第三个条件很明确 - 确保只删除两个相同列中的一个。
我很想知道这是否有效 - 它现在在我的头脑中非常有意义; - )