0

我正在尝试从具有数百万行的表中删除重复的行。我要检查重复项的字段太长(它正在存储 URL),无法放置UNIQUE索引。有什么方法可以快速删除重复项?

删除重复项的推荐方法:

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

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

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

4

2 回答 2

0

哈希将为您提供一个可以放置和索引的列,因此 t1.Name = t2.Name 将是一个便宜得多的 t1.Hash = t2.Hash。不过,将散列添加到 1,000,000 条记录需要一段时间。

如果这是一次性的,另一种选择是分页清除,例如

Where T1 >= 0 and T1 < 10000
Where T1 >= 10001 and T1 < 20000

等等

于 2012-05-24T23:02:23.190 回答
0

我可能没有想到这一点,但值得一试:

  • 创建一列 ,md5url并用 url 的 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 数量,在某些时候,两个 URL可能具有相同的 MD5。第三个条件很明确 - 确保仅删除两个相同列中的一个。

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

于 2012-05-24T23:03:57.660 回答