MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析

MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析

mysql ダーティページ

WAL メカニズムにより、InnoDB はステートメントを更新するときに、書き込みログと呼ばれるディスク操作 (REDO ログ) を作成します。REDO ログはメモリに書き込まれた後、クライアントに返され、更新が成功したことを示します。

メモリ内のデータをディスクに書き込む処理をフラッシュと呼びます。フラッシュ前は、REDO ログに基づいてデータが更新されたがまだ書き込まれておらず、データベースが古いため、実際のデータはデータベース内のデータと一致していません。メモリ データ ページの内容がディスク データ ページと一致していない場合、メモリ ページはダーティ ページと呼ばれます。メモリに書き込まれた後は、一貫性が保たれ、クリーン ページと呼ばれます。

MySQL の動作が時々非常に遅くなる場合は、ダーティ ページがフラッシュされている可能性があります。データベースフラッシュをトリガーするプロセス

  • REDO ログがいっぱいになると、システムはすべての更新操作を停止し、チェックポイントを前方にプッシュして、さらに書き込みを行うためのスペースを確保します。
  • システムのメモリが不足し、新しいメモリ ページが十分でない場合は、一部のデータ ページが削除され、他のデータ ページ用に残されます。ダーティ ページが削除されると、まずディスクに書き込まれます。
  • mysql がアイドル状態のとき。
  • mysqlを通常通りシャットダウンする場合
  • 最初のケースでは、REDO ログがいっぱいになりますが、これは InnoDB が回避したい状況です。システム全体を更新できなくなるため、これは許容できません。
  • 2番目のケースでは、メモリがいっぱいで、まずディスクに書き込む必要があります。InnoDBはバッファプールを使用してメモリを管理します。3つの状態があります。
  • 未使用のメモリページ
  • 中古品できれいなページです
  • 使用済みページとダーティページ(削除時にディスクに書き込む必要がある)

そのため、データベースを使用するときに、ダーティ ページの処理が原因でデータベースのパフォーマンスが突然低下することがあります。

ダーティページフラッシュ制御戦略

  • Innodb_io_capacity パラメータ。このパラメータは Innodb にディスク IO 容量を伝えます。 (計算式で算出)
  • InnoDBのフラッシュには、ダーティページ率とREDOログ書き込み速度という2つの主な要因があります。
  • innodb_max_derty_pages_pctはダーティページ率の上限で、デフォルトは75%です。ダーティページ率が75%を超えないようにInnodb_io_capacityパラメータ値を調整し、テーブルスペースを縮小します。

シナリオ例: データベースが占有する領域が大きすぎるため、最大のテーブルのデータの半分が削除されますが、テーブルのサイズは変更されません。

データ削除プロセス

R4 を削除する場合、InnoDB エンジンはレコード R4 のみを削除済みとしてマークします。後で ID が 300 から 600 のレコードが追加された場合、この位置は再利用されますが、ディスク ファイルのサイズは縮小されません。

データ ページ上のすべてのレコードが削除された場合、データ ページを再利用できます。

注: データ ページの再利用はレコードの再利用とは異なります。

  • たとえば、レコード R4 が削除された場合、ID 400 の行が挿入されると、そのスペースは直接再利用できます。ただし、ID 800 の行が挿入されると、その位置は再利用できません。
  • ただし、データ ページ Page A 全体のすべてのレコードが削除された後、pageA は再利用可能としてマークされます。ID=50 のレコードを挿入するために新しいデータ ページが必要な場合は、PageA を再利用可能です。
  • delete コマンドを使用してテーブル データ全体を削除すると、すべてのデータ ページが再利用可能としてマークされますが、ディスク上のファイルは小さくなりません。

データフローを挿入

データがインデックス順に挿入されると、インデックスはコンパクトになりますが、ランダムに挿入されると、インデックス データ ページのページングが発生します。

ページA がすでにいっぱいの場合、別のデータ行を挿入するとどうなるでしょうか? A がいっぱいなので、ID 550 のデータを挿入すると、データを保存するために新しいページ pageB が要求されます。分割が完了すると、pageA の最後に穴が残ります。

インデックスの値を更新すると、古い値が削除され、新しい値が挿入されるため、これも穴が発生します。

縮小する空間

テーブル A と同じ構造を持つ新しいテーブル B を作成します。テーブル A から主キー ID の昇順で 1 行ずつデータを読み取り、テーブル B に挿入します。テーブル B に穴がなくなり、データ ページの使用率が高くなります。テーブル B を一時テーブルとして使用する場合、テーブル A から B にデータをインポートした後、A を B に置き換えます。これにより、A も実質的に縮小されます。

DDL プロセス全体を通じてテーブル A を更新できないため、この DDL はオンラインではありません。バージョン 5.6 以降では、プロセスが変更されました。

一時ファイルを作成し、A 内のすべてのデータ ページをスキャンします。

データページ内のAのレコードを使用してB+ツリーを生成し、一時ファイルに保存します。

Aのすべての操作をログファイルに記録する

一時ファイルが生成された後、ログ ファイルの操作が一時ファイルに適用され、表 A と同じ論理データを持つデータ ファイルが得られます。

テーブルAのデータファイルを一時ファイルに置き換える

アイコン

図 3 のプロセスとの違いは、ログ ファイルの記録と再生操作機能が存在するため、このソリューションでは、テーブルを再構築するプロセス中にテーブル A に対する追加、削除、および変更操作が可能になる点です。

テーブルを再構築するには、alter table A engine=InnoDB コマンドを使用します。 MySQL 5.5 より前では、このコマンドの実行プロセスは上記で説明したものと似ています。唯一の違いは、一時テーブル B を自分で作成する必要がないことです。MySQL は、データの転送、テーブル名の交換、古いテーブルの削除などの操作を自動的に完了します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL フラッシュリストとダーティページフラッシュメカニズム
  • mysql ダーティ ページとは何ですか?

<<:  jsでユーザー登録機能を実装する

>>:  Linuxのdateコマンドの使用

推薦する

一意の注文番号を生成するためのMySQLの高同時実行方法

序文このブログ記事が公開された後、何人かの友人からSQL Serverバージョンがあるかどうか尋ねら...

Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します

目次ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを...

MySQL で特殊文字を含むデータベース名を作成する方法の例

序文この記事では、MySQL で特殊文字を使用してデータベース名を作成する方法について説明します。こ...

MySQL クエリ キャッシュとバッファ プール

1. キャッシュ - クエリキャッシュ次の図は、MySQL 公式サイトから提供されています: MyS...

MySQL インフラストラクチャ チュートリアル: クエリ ステートメント実行プロセスの詳細な説明

序文私は以前から、SQL 文がどのように実行され、どのような順序で実行されるのかを知りたいと思ってい...

VS2022 リモート デバッグ ツールの使い方

WeChat 関連サービスをデバッグする場合など、職場のサーバー環境でリモートデバッグを行う必要があ...

axios リクエストのカプセル化に基づく Vue アプリケーションのサンプルコード

目次axiosとは何ですか? Axios リクエストタイプ? Axiosはデフォルトのカスタム構成を...

データベースミドルウェアMyCatの紹介

1. Mycatの適用シナリオMycat は幅広いシナリオに合わせて開発されており、新しいユーザーが...

CUDA10.0 のインストールと Ubuntu での問題

Tensorflow バージョンと Cuda および CUDNN の対応: https://tens...

yumコマンドの使い方

1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.17のインストールと設定方法を参考までに紹介します。具体的な内容は...

nacos が mysql に接続できない場合の解決策

理由nacos の pom が依存する mysql バージョンが、mysql バージョンと一致してい...

DockerコンテナはホストのMySQL操作にアクセスする

背景:インターフェイスを提供する Flask プロジェクトがあり、これは Docker コンテナを使...

JS配列メソッドの詳細な説明

目次1. 元の配列が変更されます1. プッシュ(): 2.ポップ(): 3. シフト(): 4.un...

Web開発でボックスを中央に配置するいくつかの方法

1. ボックスを中央に配置するいくつかの方法を記録します。 1.0、マージン幅固定、高さ中央配置。 ...