0

問題: 何百もの同一 (スキーマ) テーブル。これらの一部には、削除する必要がある重複データがあります。これに対する私の通常の戦略は次のとおりです。

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

小さいテーブルの場合、これはうまく機能します。残念ながら、私がクリーニングしているテーブルには数億のレコードが含まれていることが多いため、これを実行している間、ジョブとクライアント接続がタイムアウトになります。(これらのテーブルは数百あるので、Perl を使用してリストを調べ、それぞれを消去しています。ここでタイムアウトが発生します)。

私が検討しているいくつかのオプション:

mysqldump - 高速ですが、後続の「挿入無視」ステップを実行する方法がわかりません

into outfile / load infile - これも高速ですが、リモート ホストから実行していて、「into outfile」で mysql サーバー上のすべてのファイルが作成されます。片付けにくい。

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

もっと良い方法があると確信しています。提案?

4

1 に答える 1

1

重複を見つけるための SQL クエリがタイムアウトせずに完了することができる場合、出力を重複データ (Count(DUPEDATA) > 1)。この SELECT の結果は INTO 一時テーブルに配置でき、その後、DELETE クエリのプライマリ テーブルと結合できます。

このアプローチでは、SQL/MySQL の集合操作の長所を利用します。Perl コーディングは必要ありません。

于 2012-04-19T15:53:43.027 に答える