0

数百万行のテーブルから重複行を削除しようとしています。重複をチェックしたいフィールドが長すぎて (URL が格納されているため)、UNIQUEインデックスを配置できません。重複をすばやく削除する方法はありますか?

重複を削除するための推奨される方法:

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

その仕事を終えることは決してないようですが、それには多くの時間が必要かもしれないと思います.

ここで聞いたアイデアの 1 つはMD5、インデックス作成と比較のためにハッシュ列を作成することです。これは推奨ルートですか?その場合、スペース/速度を考慮して、この列を切り捨てる必要がありますか?

4

2 に答える 2

0

ハッシュは、配置してインデックスを作成できる列を提供するため、t1.Name = t2.Name ははるかに安価な t1.Hash = t2.Hash になります。ただし、ハッシュを 1,000,000 レコードに追加するには時間がかかります。

これが 1 回限りの場合の別のオプションは、たとえば次のようなクリア アウトをページングすることです。

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 の数によっては、ある時点で 2 つの URL同じ MD5 を持つ可能性があるためです。3 番目の条件は明確です。つまり、2 つの同一の列のうち 1 つだけが削除されるようにします。

これが機能するかどうか知りたいです-今、私の頭の中で完全に理にかなっています;-)

于 2012-05-24T23:03:57.660 に答える