ホームページ  >  記事  >  データベース  >  サイトの運用を中断せずに数百万の MySQL 行を効率的に削除するにはどうすればよいですか?

サイトの運用を中断せずに数百万の MySQL 行を効率的に削除するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 08:39:03455ブラウズ

How to Efficiently Delete Millions of MySQL Rows Without Disrupting Site Operations?

数百万の MySQL 行を効率的に削除する

MySQL テーブルから大量のデータを削除すると、潜在的なテーブル ロックの問題により問題が発生する可能性があります。この記事では、サイトの運用を中断することなく、多数の重複データ行を削除する必要がある一般的なシナリオを検討します。

課題

この状況における主な障害は、時間がかかることです。単一のクエリを実行して数百万行を削除するときに課されるテーブル ロック。これにより、テーブルに関連する他のすべての操作が停止し、サイトが不安定になる可能性があります。

考えられる解決策

ロックの問題を軽減するには、次の 2 つの主なアプローチが利用可能です。

  1. 反復削除: これには、ループ内で多数の小規模な削除クエリを実行するスクリプトの作成が含まれ、クエリごとに影響を受ける行数を制限します。これにより単一クエリのロックは回避されますが、データベースの負荷が急増し、実行時間が長くなる可能性があります。
  2. テーブルの再作成: 別の方法は、問題のあるテーブルの名前を変更し、空の代替テーブルを作成することです。テーブルを削除し、名前を変更したテーブルでクリーンアップを実行し、最後にテーブルの名前を元に戻してデータをマージします。このアプローチでは中断は最小限に抑えられますが、特にレポート テーブルや複雑なデータ型を扱う場合には追加の手順が必要になります。

最適化されたソリューション

最適なパフォーマンスを得るには、より効率的な解決策は、ループと制限句を使用した増分削除アプローチを利用することです。これには次の手順が含まれます。

DELETE FROM `table`
WHERE (whatever criteria)
ORDER BY `id`
LIMIT 1000

クエリは、影響を受ける行がなくなるまで繰り返しられます。データベースの過負荷を防ぐために、繰り返しの間に短い一時停止が含まれます。このアプローチでは、管理可能なバッチでデータを効果的に削除しながら、他のクエリを同時に実行できるため、テーブルのロック時間と全体的な実行時間の両方が削減されます。

以上がサイトの運用を中断せずに数百万の MySQL 行を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。