問題: 何百もの同一 (スキーマ) テーブル。これらの一部には、削除する必要がある重複データがあります。これに対する私の通常の戦略は次のとおりです。
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 タイムアウトは回避されますが、かなり遅くなります。
もっと良い方法があると確信しています。提案?