ホームページ >データベース >mysql チュートリアル >特定のデータを優先しながら、大規模な MySQL データベースから重複を効率的に削除するにはどうすればよいですか?
大規模な MySQL データベースからの効率的な重複の削除
大規模な MySQL データベースから重複を排除することは、データの整合性とパフォーマンスにとって非常に重要です。ただし、大規模なテーブルの場合、重複を特定して削除するのは困難な作業になる可能性があります。ユーザーが直面する一般的な課題の 1 つは、数百万行を含む大規模なデータベースから重複を迅速に削除する必要があることです。重複の削除は、多くの場合、時間のかかるプロセスになる可能性があります。
重複の削除で発生する一般的なシナリオには、テーブルが含まれます。 id、text1、text2、および text3 の列があり、text1 と text2 の組み合わせは一意である必要があります。重複が存在する場合、text3 の非 NULL 値を持つ組み合わせが 1 つだけ残る必要があります。たとえば、データ:
| id | text1 | text2 | text3 | | --- | ----- | ----- | ----- | | 1 | abc | def | NULL | | 2 | abc | def | ghi | | 3 | abc | def | jkl | | 4 | aaa | bbb | NULL | | 5 | aaa | bbb | NULL |
... の場合、望ましい結果は次のようになります。
| id | text1 | text2 | text3 | | --- | ----- | ----- | ----- | | 1 | abc | def | ghi | | 2 | aaa | bbb | NULL |
CREATE TABLE tmp SELECT text1, text2, text3 FROM my_tbl; などのソリューションは次のようになります。 GROUP BY text1、text2;または SELECT DISTINCT は小規模なデータベースでは機能するかもしれませんが、大きなテーブルを扱う場合には実行時間が長くなることがよくあります。
この課題に対処するには、重複キーと ifnull():
create table tmp like yourtable; alter table tmp add unique (text1, text2); insert into tmp select * from yourtable on duplicate key update text3 = ifnull(text3, values(text3)); rename table yourtable to deleteme, tmp to yourtable; drop table deleteme;このアプローチでは、最適化された戦略が採用されています。元のテーブルと同様の新しいテーブル tmp を作成します。次に、text1 と text2 に一意性制約を追加して、一意性を強制します。その後、on Duplicate key 句を利用して、yourtable のデータが tmp に挿入されます。この句により、重複行が見つかった場合、新しいデータの text3 列が既存の値よりも優先されます。プロセスを完了するには、元の yourtable の名前が deleteme に変更され、tmp の名前が yourtable に変更され、古いテーブルが重複のないデータに事実上置き換えられます。最後に、deleteme テーブルが削除されます。この方法では、GROUP BY や DISTINCT などの計算量の多い操作が不要になり、MySQL の高度なクエリ最適化機能が活用されます。その結果、実行時間が大幅に改善され、大規模なデータベースからも迅速に重複を削除できるようになります。
以上が特定のデータを優先しながら、大規模な MySQL データベースから重複を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。