2012-04-19 11 views
0

問題:何百もの同一の(スキーマ)テーブル。これらの中には、削除する必要のある重複したデータがあります。これに対する私の通常の戦略は次のとおりです。mysql:クライアントのタイムアウトを回避しながら重複を削除する

walk list of tables - for each do 
create temp table with unique key on all fields 
insert ignore select * from old table 
truncate original table 
insert select * back into original table 
drop or clean temp table 

小さいテーブルの場合、これは問題ありません。残念ながら、私が頻繁にクリーニングしているテーブルには100万のレコードがありますので、私が実行している間に私の仕事とクライアントの接続がタイムアウトしています。 (これらのテーブルが何百もあるので、私はPerlを使ってリストを歩き、それぞれをきれいにしています。これがタイムアウトが起こる場所です)。

私はに探していますいくつかのオプション:

mysqldumpを - 高速だが、私はそれに続くOUTFILE /負荷INFILEにステップ

「を無視挿入」を実行する方法を見ていない - も速いのが、私はリモートホストから実行しており、 'outfile'にはmysqlサーバ上のすべてのファイルが作成されます。クリーンアップするのは難しい。

100Kレコードのブロックで挿入/選択します。これにより、dbタイムアウトは回避されますが、かなり遅くなります。

私は確かに良い方法があります。提案?

+0

[これはおそらく助けてください。](http://stackoverflow.com/questions/2385921/deleting-duplicates-from-a-large-table) – tuxuday

+0

私は 'alter ignore'ルートを試してみます終了する前にタイムアウトします。 – ethrbunny

答えて

0

重複を見つけるためのSQLクエリがタイムアウトせずに完了できる場合、WHERE句を持つCount()演算子を使用してSELECTを実行して、出力を重複データの行だけに制限することができるはずですカウント(DUPEDATA)> 1)。このSELECTの結果は、一時表に置くことができます。一時表は、DELETE問合せの主表と結合できます。

このアプローチでは、SQL/MySQLのセット操作の強みを使用します.Perlコーディングは必要ありません。

+0

私はそれが問題だと思う - すべての選択*タイムアウトになります。そして、私は重複を見つけるためにすべての列を知る必要があります。 – ethrbunny

関連する問題