列を持つ私のテーブルで、
id | email | name
1 | aa@aa.com | aa
2 | aa@aa.com | aaa
3 | bb@b.com | bb
重複したエントリを削除したいとします。最善の方法は何ですか? (複数のエントリが存在する場合、最初のレコードが保持されます)。また、私のテーブルは40GB以上/数十億のレコードです。
私たちが持っていたオプションは次のとおりです。
1)
ALTER IGNORE TABLE table_name ADD UNIQUE INDEX (email);
4 時間のダウンタイムは手頃な価格ではなかったので、考えられませんでした。
2)
- group by で削除する必要がある ID を特定し、一時テーブルにプッシュします。
- ベーステーブルを一時テーブルと内部結合し、行を削除します
これにより、穴とパフォーマンスの問題が発生します。
3)私たちが行った解決策は、
- 挿入無視オプションを使用してテーブルのダンプを取得しました(負荷を軽減するためにスレーブで行われました)
- 差分DBにデータを復元
- テーブルの名前を変更して 2 つのテーブルを交換しました
- 増分データ変更もコピーされました (ここでダウンタイムが発生しました)。これは、数分のダウンタイムで実行できます。テーブルに更新がなかったので、うまくいきました(挿入しかありませんでした)。
更新もサポートされている場合、最善の解決策は何ですか。私の主な制約はダウンタイムですか?
テーブルを含む更新クエリのログを有効にすることで3を拡張し、復元後に同じことを実行できるかもしれません。
それを行うより良い方法はありますか?