MySQL の大きなテーブルで大量のデータを一括削除する方法

MySQL の大きなテーブルで大量のデータを一括削除する方法

質問はhttps://www.zhihu.com/question/440066129/answer/1685329456から参照されています。MySQLでは、テーブルに3億のデータがあり、テーブルに分割されていません。フィールドの1つは企業タイプです。企業タイプは一般企業と自営業者です。自営業者のデータ量は約50%を占めています。条件に従って、自営業者の行はすべて削除されます。どうすればいいですか?答えはオリジナルです

テーブルエンジンはInnodb、MySQL 5.7以降であると仮定します。

レコードを削除するには、まずレコードをロックし、元のデータを破棄し、主に削除マークを追加してレコード ヘッダーを変更します。つまり、元のデータのdeleted_flagが1になり、データが削除されたことを示します。ただし、データはクリアされず、新しい行のデータのサイズがこの行のサイズよりも小さい場合は、この行を占有する可能性があります。これは実際にはストレージの断片化です。

その後、データをクリアするには、関連データのインデックスを更新する必要があります。さらに、対応する binlog および redolog ログが生成されます。
削除するデータが大量のデータである場合は、次のようになります。

  • 制限を追加しないと、大量のデータを更新する必要があり、インデックスが無効になり、テーブルをロックするためのフルスキャンが発生します。同時に、大量のインデックスの変更により、大量のログが生成され、更新時間が長くなり、テーブルロック時間が長くなります。この期間中、テーブルはオンラインビジネスを処理できません。
  • 大量のバイナリログが生成されると、マスターとスレーブの同期に対する負荷が増大する
  • マークの削除により、ストレージの断片化が大量に発生します。 MySQL はページごとにデータをロードするため、これらのストレージフラグメントによりランダム読み取りの数が大幅に増加するだけでなく、ページヒット率が低下し、ページスワップが増加します。
  • 生成されたログの量が多いため、このテーブルが占めるスペースが大幅に増加していることがわかります。

解決

削除後に制限を追加することで削除回数を制御できると考えるのは簡単です。この回数はインデックスを通過するため、テーブル全体がロックされることはありません。

しかし、ストレージの断片化、マスターとスレーブの同期、スペースの占有などの問題は解決されていません。削除が完了したら、次のステートメントを使用してテーブルを再構築できます。

テーブルを変更します。engine=InnoDB、ALGORITHM=INPLACE、LOCK=NONE;

この文は実際にテーブルを再構築することに注意してください。テーブルのエンジンはすでに InnoDB ですが、最後に ALGORITHM=INPLACE, LOCK=NONE を追加すると、テーブルをロックせずに再構築できます。

別の解決策としては、同じ構造を持つ新しいテーブルを作成し、元のテーブルにトリガーを追加することです。

各行の元のテーブルに更新後にトリガー person_trigger_update を作成します。 
begin set @x = "トリガーUPDATE";
新しいテーブルに置き換えます。SELECT * from original table where new table.id = original table.id;
終了の場合;
終わり;

これにより、オンライン ビジネスの新しいデータが同期されるようになります。その後、すべてのエンタープライズ タイプのデータを新しいテーブルに挿入します。データがすでに存在する場合、更新同期が行われていれば挿入されません。業務変更により、このテーブルでは各世帯のデータが更新されないため、テーブルロックなしの同期によって大規模テーブルのデータクリーニングが実現されます。

これで、MySQL テーブル内の大量データの一括削除の実装方法についての記事は終了です。MySQL テーブル内の大量データの一括削除の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MyBatis バッチによる MySql データの挿入/変更/削除
  • 誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装
  • mysql5.7.33 で誤って ibdata ファイルを削除した後にデータを回復する方法
  • MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します
  • MySQLがデータの削除を推奨しない理由
  • MySQL 内の数千万のデータを一括削除する Python スクリプト
  • MySQL のデータ削除とデータ テーブル メソッドの例
  • MySQL でデータを削除してもテーブル ファイルのサイズが変更されないのはなぜですか?
  • MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明
  • MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

<<:  CSS画像結合技術(スプライト画像)の詳しい説明

>>:  nginx で http でアクセスする Web サイトを https に変更する方法

推薦する

Win10 での MySQL 8.0.16 のインストールと設定のチュートリアル

1. MySQL 8.0.16を解凍する次の図に示すように、解凍後にdadaフォルダとmy.ini構...

Vue.js での VNode の使用

VNodeとはvue.js には VNode クラスがあり、これを使用してさまざまな種類の vnod...

JSは賞金の重さに基づいて当選確率を計算します

目次1. シナリオ例1.1. 抽選の賞品名を設定する1.2. 各賞の重みを設定する1.3. ラッキー...

Reactコンポーネントのライフサイクル機能についての簡単な説明

React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...

Linuxのseqコマンドを使用して数字のシーケンスを生成します(推奨)

Linux の seq コマンドは、数字のリストを非常に高速に生成でき、使いやすく柔軟性に優れてい...

Vueのログインとログアウトの詳細な説明

目次ログインビジネスプロセスログイン機能の実装要約するまず、エフェクトの実装プロセスを見てみましょう...

Windows 10 で MySQL 8.0.12 の解凍バージョンをインストールして構成する方法 (グラフィック チュートリアル付き)

この記事では、MySQL 8.0.12 の解凍版のインストールと設定方法を記録し、皆様と共有します。...

Vue ページ印刷で自動ページングを実装する 2 つの方法

この記事では、ページ印刷の自動ページングを実現するためのVueの具体的なコードを例として紹介します。...

Tomcat9 のダウンロード、インストール、設定 + Eclipse への統合に関する詳細なチュートリアル

トムキャット公式サイトtomcatはローカルサーバーと同等であり、Webページを開くことができます設...

MySql データ型チュートリアル例の詳細な説明

目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...

Vueダイナミックフォームの詳細な応用

概要バックグラウンド管理システムには多くのフォーム要件があります。データをjson 形式で書き込み、...

ブラウザが登録できるイベントの概要

HTML イベント リスト一般イベント: onClick HTML: マウスクリックイベント。主にオ...

Dockerは1行のコマンドでFTPサービス構築の実装を完了します

1行のコマンド docker run -d \ -v /share:/home/vsftpd \ -...

jQueryのチェーンプログラミングスタイルの詳細な例

チェーンプログラミングの実装原理jQuery を使用すると、開発者は常にドット構文を使用して独自のメ...

Linux サーバー上のローカル静的リソースにアクセスするために nginx を使用する方法

1. ポート 80 が占有されているかどうかを確認します。通常、ポート 80 は Apache サー...