[解決済み] MySQLで数百万行を削除する
2023-02-27 13:45:16
質問
最近、私が作業しているサイトでバグを発見し修正したのですが、その結果、テーブル内に何百万もの重複したデータ行が発生しました。これらの重複行は簡単に見つけることができ、1つの削除クエリを実行してすべてを削除することができます。問題は、これだけの行を一度に削除しようとすると、テーブルが長時間ロックされてしまうことです。サイトをダウンさせることなく (テーブルをロックすることで) これらの行を削除するために私が見ることができる唯一の方法は、次のとおりです。
- ループ内で何千もの小さな削除クエリを実行するスクリプトを作成します。これは、理論的には、他のクエリがキューに入り、削除の間に実行されるため、ロックされたテーブルの問題を回避することができます。しかし、それでもデータベースの負荷はかなり急上昇し、実行には長い時間がかかります。
- テーブルの名前を変更し、既存のテーブルを再作成します (現在は空になります)。その後、名前を変更したテーブルで私のクリーンアップを行います。新しいテーブルの名前を変更し、古いテーブルの名前を戻し、新しい行を名前変更後のテーブルにマージします。この方法は、かなり多くのステップを必要としますが、最小限の中断で仕事を完了させることができます。唯一厄介なのは、問題のテーブルがレポートテーブルであることで、いったん名前を変えて空のテーブルを置くと、元の場所に戻すまで、すべての履歴レポートが消えてしまうのです。さらに、保存されているデータの種類によって、マージ処理に少し手間がかかる可能性があります。全体的には、これが今のところ私の有力な選択肢です。
もしそうなら、サイトをダウンさせることなく、できればユーザーへの影響を最小限に抑えながら、どのように対処されたのでしょうか。2 番の方法、または別の同様の方法を取る場合、深夜に実行し、翌朝早くマージするようにスケジュールを組み、前もってユーザーに知らせることができるので、大きな問題ではありません。私はただ、クリーンアップを行うためのより良い、またはより簡単な方法について誰かがアイデアを持っているかどうかを確認したいだけなのです。
どのように解決するのですか?
DELETE FROM `table`
WHERE (whatever criteria)
ORDER BY `id`
LIMIT 1000
洗って、洗って、影響を受ける行がゼロになるまで繰り返す。 繰り返しの間に1秒か3秒スリープするスクリプトにするとよいでしょう。
関連
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み】マルチパート識別子をバインドできない
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み】MySQL:カラムがNULLの場合の行の選択
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
ジョイントインデックスのためのmysqlの条件とインデックスが失敗するための条件
-
SQL基本クエリステートメント
-
MySQLインストールチュートリアル(Windows用)詳細
-
Mysqlデータベースの手動および定期的なバックアップ手順
-
mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み】マルチパート識別子をバインドできない
-
[解決済み] Ubuntu linux上で動作するリモートMySQLサーバーを再起動する方法は?
-
[解決済み] utf8_general_ciとutf8_unicode_ciの違いは何ですか?