Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

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 2198863872Dictionary memory allocated 776332Buffer pool size   131072Free buffers       124908Database pages     5720Old database pages 2071Modified db pages  910Pending reads 0Pending writes: LRU 0, flush list 0, single page 0Pages made young 4, not young 00.10 youngs/s, 0.00 non-youngs/sPages read 197, created 5523, written 50600.00 reads/s, 190.89 creates/s, 244.94 writes/sBuffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not0 / 1000Pages read ahead 0.00/s, evicted without access 0.00/s, Random readahead 0.00/sLRU len: 5720, unzip_LRU len: 0I/O sum[0]:cur[0], unzip sum[0]:cur[0]

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

注記

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

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

名前説明
割り当てられた合計メモリーバッファプールに割り当てられた合計メモリー (バイト)。
割り当てられたディクショナリメモリーInnoDB データディクショナリに割り当てられた合計メモリー (バイト)。
バッファプールサイズバッファプールに割り当てられたページ単位の合計サイズ。
空きバッファバッファープール空きリストの合計サイズ (ページ数)。
データベースページバッファプール LRU リストの合計サイズ (ページ数)。
古いデータベースページバッファプールの古い LRU サブリストの合計サイズ (ページ数)。
変更された DB ページバッファプールで変更された現在のページ数。
保留検針バッファープールへの読み取りを待機しているバッファープールページの数。
保留中の書込み LRULRU リストの下部から書き込まれるバッファプール内の古いダーティページの数。
保留中の書込みフラッシュリストチェックポイント中にフラッシュされるバッファープールページの数。
保留中の書込み単一ページバッファプール内の保留中の独立したページ書込みの数。
若いページバッファプール 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 テーブルのクエリー」を参照してください。