0

末尾のスラッシュだけが異なるほぼ重複するエントリをデータベースから見つけて削除する必要がありました。つまり、ある行には「http://www.google.com」という URL があり、別の行には「 http://www.google.com/」という URL がありますこのソリューション:

DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE TRIM(TRAILING '/' FROM li1.url) =
      TRIM(TRAILING '/' FROM li2.url)
AND li1.id<li2.id

コードは必要なときに正確に実行されましたが、サーバーのメモリをすべて使い果たし、毎回 VPS を強制終了しました。サーバーを維持するために、リソースをあまり消費しない、またはより遅い方法でこれを実行する代替手段はありますか? phpmyadmin でコマンドを実行しています。どうも!

4

1 に答える 1

1

末尾のスラッシュを 1 つのステートメントで削除するとどうなりますか。

UPDATE Link_Info
SET url=LEFT(url, LENGTH(url)-1) /*everything but the last character, which can only be a slash*/
WHERE url LIKE '%/';

次に、クリーンアップ スクリプトを実行しますが、スラッシュ処理は実行しません。

DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE li1.url = li2.url
AND li1.id<li2.id

このように、処理を分割できます。MySql についてはよくわかりませんが、結合基準 ( TRIM(TRAILING '/' FROM li1.url) = TRIM(TRAILING '/' FROM li2.url)) に関数があるということは、おそらく、クエリがどのインデックスからも恩恵を受けられないことを意味します。

ああ、そうしているうちに、スペースもクリーンアップしたくなるかもしれません:

UPDATE Link_Info
SET url=LTRIM(RTRIM(url))
WHERE url LIKE '% %';

したがって、スペースをクリーンアップしてから、末尾のスラッシュを削除してから、重複除去を行います。

于 2013-02-01T03:46:15.293 に答える