MySQL 8.0 リファレンスマニュアル


15.5.1 バッファプール

バッファプールは、InnoDB がアクセス時にテーブルおよびインデックスデータをキャッシュするメインメモリー内の領域です。 バッファープールを使用すると、頻繁に使用されるデータをメモリーから直接処理できるため、処理速度が向上します。 専用サーバーでは、多くの場合、最大 80% の物理メモリーがバッファプールに割り当てられます。

大容量読み取り操作の効率を高めるため、バッファープールは複数行を保持できるページに分割されます。 キャッシュ管理を効率化するために、バッファプールはページのリンクリストとして実装されます。使用頻度が低いデータは、LRU アルゴリズムのバリエーションを使用してキャッシュから削除されます。

バッファプールを利用して頻繁にアクセスされるデータをメモリーに保持する方法を理解することは、MySQL チューニングの重要な側面です。

バッファプール LRU アルゴリズム

バッファプールは、最低使用頻度 (LRU) アルゴリズムのバリエーションを使用してリストとして管理されます。 バッファプールに新しいページを追加するための領域が必要な場合は、最も最近使用されていないページが削除され、新しいページがリストの中央に追加されます。 このミッドポイント挿入戦略はリストを 2 つのサブリストとして扱います。

  • 先頭は、最近アクセスされた「新しい」 (若い) ページのサブリスト

  • 末尾は、最近アクセスされていない「古い」ページのサブリスト

図 15.2 バッファプールリスト

内容は周囲のテキストで説明されています。

このアルゴリズムは、頻繁に使用されるページを新しいサブリストに保持します。 古いサブリストには、あまり頻繁に使用されないページが含まれています。これらのページは eviction の候補です。

デフォルトでは、アルゴリズムは次のように動作します:

  • バッファープールの 3/8 が古いサブリストに割り振られます。

  • リストのミッドポイントは、新しいサブリストの末尾と古いサブリストの先頭が接する境界です。

  • InnoDB は、バッファプールにページを読み取るときに、最初に中間ポイント (古いサブリストの先頭) にページを挿入します。 ページの読込みは、SQL クエリーなどのユーザーが開始する操作、または InnoDB によって自動的に実行される先読み操作が要求した場合に発生する可能性があります。

  • 古いサブリストのページにアクセスすると、「若い」になり、新しいサブリストの先頭に移動します。 ユーザーが開始した操作の要求によるページが読み込まれた場合、最初のアクセスがただちに行われ、ページは若いページになります。 先読み操作のためにページが読み込まれた場合、最初のアクセスはすぐに発生せす、ページが削除されるまでまったく行われない可能性もあります。

  • データベースが動作するにつれて、アクセスされないバッファプール内のページは、リストの後方に移動し age なります。 新しいサブリストと古いサブリストの両方のページは、他のページが新しいページになるとエージングされます。 古いサブリスト内のページも、中間点にページが挿入されると有効になります。 最終的に、未使用のままのページは古いサブリストの末尾に到達し、削除されます。

デフォルトでは、クエリーによって読み取られたページはすぐに新しいサブリストに移動されます。つまり、これらのページはバッファプールに保持されます。 たとえば、mysqldump または WHERE 句のない SELECT ステートメントなどにおいて実行されるテーブルスキャンは、新しいデータが再度使用されない場合でも、大量のデータをバッファプールに取り込み、同等の量の古いデータを削除する可能性があります。 同様に、先読みバックグラウンドスレッドによってロードされ、一度のみアクセスされるページは、新しいリストの先頭に移動されます。 これらの状況では、頻繁に使用されるページが、削除の対象となる古いサブリストに移動される可能性があります。 この動作の最適化の詳細は、セクション15.8.3.3「バッファープールをスキャンに耐えられるようにする」 および セクション15.8.3.4「InnoDB バッファープールのプリフェッチ (先読み) の構成」 を参照してください。

InnoDB 標準モニターの出力には、バッファプール LRU アルゴリズムの操作に関する BUFFER POOL AND MEMORY セクションのいくつかのフィールドが含まれています。 詳細は、InnoDB 標準モニターを使用したバッファープールのモニタリングを参照してください。

バッファプール構成

バッファプールの様々な側面を構成して、パフォーマンスを向上させることができます。

InnoDB 標準モニターを使用したバッファープールのモニタリング

SHOW ENGINE INNODB STATUS を使用してアクセスできる InnoDB 標準モニターの出力では、バッファプールの操作に関するメトリックが提供されます。 バッファプールメトリックは、InnoDB 標準モニター出力の BUFFER POOL AND MEMORY セクションにあり、次のように表示されます:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 776332
Buffer pool size   131072
Free buffers       124908
Database pages     5720
Old database pages 2071
Modified db pages  910
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 4, not young 0
0.10 youngs/s, 0.00 non-youngs/s
Pages read 197, created 5523, written 5060
0.00 reads/s, 190.89 creates/s, 244.94 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not
0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read
ahead 0.00/s
LRU len: 5720, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

次のテーブルでは、InnoDB 標準モニターによってレポートされるバッファープールメトリックについて説明します。

注記

InnoDB 標準モニター出力で提供される秒当たりの平均は、InnoDB 標準モニター出力が最後に出力されてからの経過時間に基づきます。

表 15.2 InnoDB バッファプールメトリック

名前 説明
割り当てられた合計メモリー バッファプールに割り当てられた合計メモリー (バイト)。
割り当てられたディクショナリメモリー InnoDB データディクショナリに割り当てられた合計メモリー (バイト)。
バッファプールサイズ バッファプールに割り当てられたページ単位の合計サイズ。
空きバッファ バッファープール空きリストの合計サイズ (ページ数)。
データベースページ バッファプール LRU リストの合計サイズ (ページ数)。
古いデータベースページ バッファプールの古い LRU サブリストの合計サイズ (ページ数)。
変更された DB ページ バッファプールで変更された現在のページ数。
保留検針 バッファープールへの読み取りを待機しているバッファープールページの数。
保留中の書込み LRU LRU リストの下部から書き込まれるバッファプール内の古いダーティページの数。
保留中の書込みフラッシュリスト チェックポイント中にフラッシュされるバッファープールページの数。
保留中の書込み単一ページ バッファプール内の保留中の独立したページ書込みの数。
若いページ バッファプール LRU リストで若くなったページの合計数 (new ページのサブリストの先頭に移動)。
作成されたページが若くない バッファプール LRU リストで若くなっていないページ (若くなっていない old サブリストに残っているページ) の合計数。
youngs/s ページを若くしたバッファプール LRU リスト内の古いページへのアクセスの秒当たりの平均。 詳細は、このテーブルの後のノートを参照してください。
non-youngs/s バッファプール LRU リスト内の、ページを若くしなかった古いページへのアクセスの秒当たりの平均。 詳細は、このテーブルの後のノートを参照してください。
読み取られたページ バッファプールから読み取られたページの合計数。
作成されたページ バッファプール内に作成されたページの合計数。
書き込まれたページ バッファプールから書き込まれたページの合計数。
reads/s バッファプールページ読取り/秒の平均数。
creates/s 作成されたバッファプールページの秒当たりの平均数/秒。
writes/s バッファプールページ書込みの秒当たりの平均数。
バッファプールヒット率 バッファプールメモリーから読み取られたページとディスク記憶域から読み取られたページのバッファプールページヒット率。
若いマーキング率 ページアクセスによってページが若くなった平均ヒット率。 詳細は、このテーブルの後のノートを参照してください。
not (若いマーキング率) ページアクセスによってページが若くなっていない平均ヒット率。 詳細は、このテーブルの後のノートを参照してください。
先読みされたページ 先読み操作の秒当たりの平均。
アクセス権なしで削除されたページ バッファプールからアクセスせずに削除されたページの秒当たり平均。
ランダム先読み ランダム先読み操作の秒当たりの平均。
LRU len バッファプール LRU リストの合計サイズ (ページ数)。
unzip_LRU len バッファープールの unzip_LRU リストの合計サイズ (ページ数)。
I/O 合計 過去 50 秒間にアクセスされたバッファプール LRU リストページの合計数。
I/O cur アクセスしたバッファプール LRU リストページの合計数。
I/O unzip sum アクセスされたバッファプール unzip_LRU リストページの合計数。
I/O unzip cur アクセスされたバッファプール unzip_LRU リストページの合計数。

メモ:

  • youngs/s メトリックは、古いページにのみ適用できます。 これは、ページ数ではなく、ページへのアクセス数に基づきます。 特定のページへの複数のアクセスが可能で、そのすべてがカウントされます。 大規模なスキャンが発生していないときに非常に低い youngs/s 値が表示される場合は、遅延時間を短縮するか、古いサブリストに使用されるバッファープールの割合を増やす必要がある場合があります。 パーセンテージを増やすと古いサブリストが大きくなるため、そのサブリスト内のページが末尾に移動するのに時間がかかり、これらのページに再度アクセスして若くなる可能性が高くなります。

  • non-youngs/s メトリックは、古いページにのみ適用できます。 これは、ページ数ではなく、ページへのアクセス数に基づきます。 特定のページへの複数のアクセスが可能で、そのすべてがカウントされます。 大規模なテーブルスキャンの実行時に non-youngs/s 値が高くない (および youngs/s 値が大きい) 場合は、遅延値を増やします。

  • young-making レートは、古いサブリスト内のページへのアクセスだけでなく、すべてのバッファープールページへのアクセスを考慮します。 young-making レートおよび not レートは、通常、全体的なバッファプールヒット率に加算されません。 古いサブリストのページヒットによってページが新しいサブリストに移動しますが、新しいサブリストのページヒットによってリストの先頭に移動されるのは、先頭から一定の距離がある場合のみです。

  • not (young-making rate) は、innodb_old_blocks_time で定義された遅延が満たされていないか、ページがヘッドに移動されなかった新しいサブリストのページヒットが原因で、ページアクセスの結果ページが若くなっていない平均ヒット率です。 このレートは、古いサブリスト内のページへのアクセスだけでなく、すべてのバッファープールページへのアクセスを考慮します。

バッファプール server status variablesINNODB_BUFFER_POOL_STATS テーブルには、InnoDB Standard Monitor の出力と同じバッファプールメトリックが多数用意されています。 詳細は、例15.10「INNODB_BUFFER_POOL_STATS テーブルのクエリー」を参照してください。


関連キーワード:  InnoDB, ページ, プール, バッファ, リスト, テーブル, アクセス, 構成, LRU, 合計