MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明

MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明

ストレージエンジンのメモリ管理

InnoDB ストレージ エンジンでは、データベース内のバッファー プールは LRU (Latest Recent Used) アルゴリズムによって管理されます。つまり、最も頻繁に使用されるページは LRU リストの先頭に配置され、最も使用頻度の低いページは LRU リストの末尾に配置されます。バッファー プールが新しく読み取られたページを格納できない場合は、LRU リストの末尾にあるページが最初に解放されます。

上の図では、キューを表すために 8 つのデータ ページを使用しています。それぞれの具体的な機能については、後ほど説明します。 InnoDB ストレージ エンジンでは、バッファー プール内のページのデフォルト サイズは 16 KB です。LRU リストには中間点の位置があります。新しく読み取られたデータ ページは、LRU リストの先頭に直接配置されるのではなく、LRU リストの中間点の位置に配置されます。この操作は、中間点挿入戦略とも呼ばれ、中間点挿入戦略とも呼ばれます。デフォルト構成では、この位置は LRU 長さの 5/8 にあるため、上記では 8 つのデータ ページが使用されます。次の図は、新しいデータ ページを挿入するプロセスを示しています。

mitpoint の場所は、次のようにパラメータ innodb_old_blocks_pct によって制御できます。

mysql> 'innodb_old_blocks_pct' のような変数を表示します。
+-----------------------+-------+
| 変数名 | 値 |
+-----------------------+-------+
| innodb_old_blocks_pct | 37 |
+-----------------------+-------+
 セット内の行 (. sec)

上記の例から、結果は 37 となり、新しく読み取られたページは LRU リストの末尾の約 37% の位置に挿入されることを意味します。これは距離の約 3/8 です。InnoDB ストレージ エンジンでは、中間点より前のページを新しいリスト、中間点より後のページを古いリストと呼びます。新しいリストのページは、最もアクティブなデータです。

データ ページを LRU キューの先頭に置かないのはなぜですか?

新しく読み取られたデータ ページが LRU キューの先頭に配置されない理由は、一部のフル テーブル スキャン SQL 操作によって LRU キューからすべてのホット データが更新され、ホット データへの次のアクセスで対応するデータをディスクから取得する必要が生じ、バッファー プールの効率に影響が出るためです。この問題を解決するために、InnoDB は別のパラメータ innodb_old_blocks_time を使用して LRU リストを管理します。このパラメータは、ページが中間点まで読み取られた後、LRU リストのホット エンドに追加されるまでにかかる時間を示すために使用されます。したがって、上記のような SQL 操作を実行する必要がある場合、次の方法を使用することで、LRU リスト内のホット データがフラッシュアウトされることをできるだけ防ぐことができます。

mysql> グローバル innodb_old_blocks_time= を設定します。
クエリは正常、行は影響を受けました (0.00 秒)

つまり、1000 秒後には、データを LRU リストのホット エンドに更新できるようになります。

実際の状況では、データ ページのアクティブ率が 63% を超える場合、ユーザーは innodb_old_blocks_pct を設定することで、ホット ページがフラッシュされる可能性を減らすこともできます。

mysql> グローバル innodb_old_blocks_pct= を設定します。                                                                                                     
クエリは正常、行は影響を受けました (0.00 秒)

データベースを起動したばかりのときは、LRU の内容は空です。このとき、すべてのデータ ページは Free リストに配置されます。バッファー プールからのページングが必要な場合は、まず Free リストから使用可能な Free ページがあるかどうかを確認します。ある場合は、Free ページからページを削除してから、LRU リストに配置します。 LRU リストの末尾にあるデータ ページを削除し、新しいページにメモリ領域を割り当てます。このプロセスのフローチャートは次のとおりです。

LRU リスト内のページが古い部分から新しい部分に追加されるとき、このときに発生する操作は page made young と呼ばれ、innodb_old_blocks_time の設定により古い部分から新しい部分に移動されない操作は page_not_made young と呼ばれます。 show engine innodb status を使用して、LRU リストと空きリストの使用状況と実行状態を確認できます。

mysql> エンジン innodb ステータスを表示\G
***
***
----------------------
バッファプールとメモリ
----------------------
割り当てられた大容量メモリの合計 
辞書メモリ割り当て 
バッファプールのサイズ   
空きバッファ       
データベースページ     
古いデータベースページ 
変更されたDBページ  
保留中の読み取り      
保留中の書き込み: LRU、フラッシュリスト、単一ページ 
若くないページ 
0.00 ヤング/秒、0.00 非ヤング/秒
読んだページ、作成したページ、書き込んだページ 
0.00 読み取り/秒、0.00 作成/秒、0.00 書き込み/秒
最後の印刷以降、バッファプールページは取得されません
ページ先読み 0.00/秒、アクセスなしで削除 0.00/秒、ランダム先読み 0.00/秒
LRU 長さ: 、unzip_LRU 長さ: 
I/O sum[]:cur[]、unzip sum[]:cur[]
--------------
行操作
--------------
 InnoDB 内のクエリ、キュー内のクエリ
 InnoDB 内で開かれたビューの読み取り
プロセス ID=、メイン スレッド ID=、状態: スリープ
挿入、更新、削除、読み取りされた行数 
0.00 挿入/秒、0.00 更新/秒、0.00 削除/秒、0.00 読み取り/秒
----------------------------
INNODB モニター出力の終了
============================

 セット内の行数 (0.00 秒)

上記の結果から、現在のバッファ プール サイズは合計 8191 ページであり、各データ ページのサイズは 16k、バッファ プールの合計サイズは 8191*16k=128M であることがわかります。ここで、Free buffers は現在の Free リスト内のページ数を示します。 page made young は、LRU リスト内のページが先頭に移動された回数を示します。サーバーは操作中に innodb_old_blocks_time の値を変更しないため、not young は 0 です。youngs/s と non_youngs/s は、1 秒あたりのこれら 2 種類の操作の数を示します。

InnoDB ストレージ エンジンはバージョン 1.0.x 以降で圧縮ページをサポートしており、元の 16 KB のデータ ページを 1 KB、2 KB、4 KB、8 KB に圧縮します。 16KB以外のページはunzip_LRUで管理されます。上記コマンドの22行目には圧縮ページと非圧縮ページの情報が表示されています。

注意すべき点の 1 つは、空きバッファー値とデータベース ページ値の合計が必ずしもバッファー プール サイズと等しくならないことです。これは、バッファー プール内のページには、アダプティブ ハッシュ インデックスやロック情報などのページも割り当てられる可能性があり、これらのページでは LRU アルゴリズムのメンテナンスが必要ないためです。

ダーティページ

LRU リスト内のページが変更された後、そのページは「ダーティ ページ」と呼ばれます。つまり、バッファ プール内のデータ ページはディスク上のデータと一致しません。バッファ プール内のデータの方が新しいです。このとき、データベースはチェックポイント メカニズムを通じてダーティ ページをディスクにリフレッシュし、フラッシュ リスト内のページはダーティ ページ リストになります。ダーティ ページは、LRU リストとフラッシュ リストの両方に存在します。LRU リストは、バッファ プール内のページの可用性を管理するために使用され、フラッシュ リストは、ディスクへのページのリフレッシュを管理するために使用されます。この 2 つは互いに影響しません。フラッシュ リストは、show engine innodb status を通じても表示できます。前の結果リストの 13 行目にある modified db pages は、現在のダーティ ページの数であり、メタデータ テーブル INNODB_BUFFER_PAGE_LRU を通じて表示できます。

以上がMySQL InnoDBストレージエンジンのメモリ管理の詳細な説明です。InnoDBのメモリ管理の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLアーキテクチャに基づく分析
  • MySQLアーキテクチャに基づく詳細な分析
  • MySQLのストレージエンジンの詳細な説明
  • MySQLメモリストレージエンジンに関する知識
  • MySQL のストレージ エンジンの違いと比較
  • MySQL シリーズ 7 MySQL ストレージ エンジン
  • MySQLのInnoDBストレージエンジンにおけるさまざまなロックの詳細な説明
  • MySQL の MyISAM ストレージ エンジンにおける非クラスター化インデックスの詳細な説明
  • MySQL ストレージ エンジン InnoDB と MyISAM
  • MySQL アーキテクチャとストレージ エンジンの紹介

<<:  JS での new の手書き実装

>>:  ウェブページのアクセス速度に関する主な問題と解決策

推薦する

HTML onfocus gain focus および onblur lose focus イベントの詳細な説明

HTML onfocus イベント属性定義と使用法onfocus 属性は、要素がフォーカスを受け取っ...

Nginx+Tomcat 負荷分散クラスタのインストールと構成のケースの詳細な説明

目次序文1. Nginx+Tomcat 2. Nginxサーバーを構成する3. Tomcatアプリケ...

VMware Workstation 14 Pro インストール Ubuntu 16.04 チュートリアル

この記事では、VMware Workstation14 ProにUbuntu 16.04をインストー...

VMware Workstation 12 Pro Linux インストール チュートリアル

この記事は、VMware Workstation 12 ProのインストールLinuxチュートリアル...

HTML と CSS の命名規則の概要

CSS命名規則 ヘッダー: ヘッダーコンテンツ: コンテンツ/含むフッターナビゲーション: navサ...

js でシンプルなタブを実装する

タブ選択カードは、実際の Web ページで非常に頻繁に使用されます。基本的に、すべての Web ペー...

vue 動的コンポーネント

目次1. コンポーネント2. キープアライブ2.1 問題点2.2 キープアライブを使って解決する2....

リモートホスト上でスクリプトや命令を実行する Zabbix の詳細な説明

シナリオ要件1. zabbix_server Web インターフェースのスクリプト機能を使用すると、...

SpringBootをDockerにデプロイし、jarパッケージを置き換える方法の詳細な説明

目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...

CSS3 回転キューブ問題の詳細な説明

3D座標の概念要素が回転すると、その座標軸も一緒に回転します。注 -y方向の問題立方体を回転させる効...

mysql8.0 Windows x64 zip パッケージのインストールと構成のチュートリアル

MySQL 8 Windows版 zipインストール手順(ダウンロードアドレス) 1. ZIPファイ...

Linuxでファイルの作成時間を表示する方法

1. はじめにLinux でファイルの作成時刻が見つかるかどうかは、ファイル システムの種類によって...

Ubuntu環境でxdebugをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で xdebug をコンパイルしてインストールする方法について説明し...

MySql における無効な Null セグメント判定と IFNULL() 失敗の解決策

MySql Nullフィールド判定とIFNULL失敗処理ps: (プロセスを表示したくない場合は、S...

CSSアダプティブレイアウトは、サブ要素項目の全体的な中央揃えと内部項目の左揃えを実現します。

日常業務では、次のようなレイアウトに遭遇することがあります。親要素のフレーム (ブラウザのサイズに応...