バッファプールは、InnoDB
がアクセス時にテーブルおよびインデックスデータをキャッシュするメインメモリー内の領域です。 バッファープールを使用すると、頻繁に使用されるデータをメモリーから直接処理できるため、処理速度が向上します。 専用サーバーでは、多くの場合、最大 80% の物理メモリーがバッファプールに割り当てられます。
大容量読み取り操作の効率を高めるため、バッファープールは複数行を保持できるページに分割されます。 キャッシュ管理を効率化するために、バッファプールはページのリンクリストとして実装されます。使用頻度が低いデータは、LRU アルゴリズムのバリエーションを使用してキャッシュから削除されます。
バッファプールを利用して頻繁にアクセスされるデータをメモリーに保持する方法を理解することは、MySQL チューニングの重要な側面です。
バッファプールは、最低使用頻度 (LRU) アルゴリズムのバリエーションを使用してリストとして管理されます。 バッファプールに新しいページを追加するための領域が必要な場合は、最も最近使用されていないページが削除され、新しいページがリストの中央に追加されます。 このミッドポイント挿入戦略はリストを 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
はさらにインメモリーデータベースのように動作し、ディスクから 1 回データを読み取り、後続の読み取り時に、メモリーからデータにアクセスします。 セクション15.8.3.1「InnoDB バッファプールサイズの構成」を参照してください。十分なメモリーがある 64 ビットシステムでは、バッファプールを複数の部分に分割して、同時操作間のメモリー構造の競合を最小限に抑えることができます。 詳細は、セクション15.8.3.2「複数のバッファープールインスタンスの構成」を参照してください。
アクセス頻度が低い大量のデータをバッファプールに取り込むような突然のスパイクに関係なく、頻繁にアクセスされるデータをメモリーに保持することができます。 詳細は、セクション15.8.3.3「バッファープールをスキャンに耐えられるようにする」を参照してください。
先読みリクエストを実行してバッファプールにページを非同期的にプリフェッチする方法とタイミングを制御して、ページのニーズが低下することを予測できます。 詳細は、セクション15.8.3.4「InnoDB バッファープールのプリフェッチ (先読み) の構成」を参照してください。
バックグラウンドフラッシュが発生するタイミング、およびフラッシュ率をワークロードに基づいて動的に調整するかどうかを制御できます。 詳細は、セクション15.8.3.5「バッファープールのフラッシュの構成」を参照してください。
サーバーの再起動後の長いウォームアップ期間を回避するために、
InnoDB
が現在のバッファプールの状態を保持する方法を構成できます。 詳細は、セクション15.8.3.6「バッファープールの状態の保存と復元」を参照してください。
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 variables と INNODB_BUFFER_POOL_STATS
テーブルには、InnoDB
Standard Monitor の出力と同じバッファプールメトリックが多数用意されています。 詳細は、例15.10「INNODB_BUFFER_POOL_STATS テーブルのクエリー」を参照してください。