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 に変更する方法

推薦する

Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...

Springboot アプリケーションを迅速にデプロイするために Docker とアイデアを統合する詳細なプロセス

目次1. はじめに2. 環境とツール3. Dockerをインストールし、リモート接続を構成する4. ...

HTML テーブル_Powernode Java アカデミー

HTMLで表を描くには、表タグを使用します。 trは行を意味しますtdは列を示すth はテーブ...

APPログインインターフェースシミュレーション要求を実装するためのPostmanデータ暗号化と復号化

目次主に使用されるPostmanの機能データの暗号化と復号化さまざまなパラメータ設定実際に送信された...

Linux で so または実行可能プログラムの依存ライブラリを表示します

Linux で実行可能プログラムまたは so の依存ライブラリを表示します。 Linux の実行可能...

検証例 MySQL | 同じ値を持つフィールドを更新すると、binlog に記録されます

1. はじめに数日前、開発仲間から、フィールドを同じ値に更新すると binlog が記録されるかどう...

ウェブページ経由で jar パッケージを Nexus にアップロードする方法

Maven を使用してプロジェクトを管理する場合、jar パッケージをプライベート ウェアハウスにア...

VMware ワークステーション 12 に Ubuntu 14.04 (64 ビット) をインストール

1. インストール環境コンピュータモデル: Lenovo Y471a (i5) ノートパソコンシステ...

RabbitMQ の Docker インストールと設定手順

目次単一マシンの展開オンラインプルミラーを見るRabbitMQを作成して実行するMQコンテナを正常に...

MySQLでデータテーブルを作成するときにエンジンMyISAM/InnoDBを設定する

mysql を構成するときに、構成ファイル内のデフォルトのストレージ エンジンを InnoDB に設...

MySQL 8.0.13 のダウンロードとインストールのチュートリアル(画像とテキスト付き)

MySQL は最もよく使用されるデータベースです。詳しく知るには、コンピュータにインストールする必...

Vue のトランジション効果とアニメーショントランジションの使用例の詳細な説明

目次遷移フック関数カスタム遷移クラス名遷移グループの使用まとめまずは例を見てみましょうコードは次のと...

ミニマルなウェブサイトデザインの例

Web アプリケーション クラス1. みんなのためにダウンまたは私だけのためにこのウェブサイトは、ウ...

MySQL GTID マスターとスレーブの不一致を修復するソリューション

目次解決策1: レプリカを再構築する前提条件アドバンテージ欠点手順マスター奴隷解決策2: データ修復...