从对于INDEX来说太大的列中删除MySQL中的重复项

时间:2012-05-24 22:33:01

标签: mysql sql database indexing

我正在尝试从包含数百万行的表中删除重复的行。我要检查重复项的字段太长(它存储URL)以放置UNIQUE索引。有没有办法快速删除重复项?

删除重复项的推荐方法:

DELETE t1 FROM table1 AS t1 JOIN table1 AS t2 ON t1.id>t2.id AND t1.name=t2.name;

似乎永远不会完成它的工作,但我想它可能只需要很多时间。

我在这里听到的一个想法是为索引和比较创建一个MD5哈希列。这是推荐路线吗?如果是这样,我是否应截断此列以获取空间/速度考虑因素?

2 个答案:

答案 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。第三个条件很明确 - 确保只删除两个相同列中的一个。

我很想知道这是否有效 - 它现在在我的头脑中非常有意义; - )