先読み要求とは、バッファープール内の複数のページがすぐに必要になるという予測のもとに、非同期にこれらのページのプリフェッチを行う I/O 要求のことです。これらの要求によって、すべてのページが 1 つのエクステント内に移動されます。InnoDB は、I/O パフォーマンスを向上させるために、次の 2 つの先読みアルゴリズムを使用します。
線形先読みは、順次にアクセスされているバッファープール内のページに基づいて、どのページがすぐに必要になる可能性があるかを予測する手法です。構成パラメータ innodb_read_ahead_threshold
を使用して、非同期読み取り要求をトリガーするために必要な順次ページアクセスの数を調整することにより、InnoDB がいつ先読み操作を実行するかを制御します。このパラメータが追加される前、InnoDB は現在のエクステントの最後のページを読み取るときに、次のエクステント全体に対する非同期プリフェッチ要求を発行するかどうかを推測するだけでした。
構成パラメータ innodb_read_ahead_threshold
は、順次ページアクセスのパターンの検出において InnoDB がどれだけ早く反応するかを制御します。エクステントからシーケンシャルに読み取られるページの数が innodb_read_ahead_threshold
以上である場合、InnoDB は、次のエクステント全体の非同期先読み操作を開始します。これは 0 から 64 までの任意の値に設定できます。デフォルト値は 56 です。この値が大きいほど、アクセスパターンのチェックは厳密になります。たとえば、この値を 48 に設定すると、InnoDB は、現在のエクステント内の 48 ページが順次にアクセスされた場合にのみ線形先読み要求をトリガーします。この値が 8 である場合、InnoDB は、エクステント内の 8 ページが順次にアクセスされただけでも非同期先読みをトリガーします。このパラメータの値は MySQL 構成ファイルで設定するか、または SET GLOBAL
コマンド (これには SUPER
権限が必要です) で動的に変更できます。
ランダム先読みは、すでにバッファープール内に存在するページに基づいて、これらのページが読み取られた順序には関係なく、ページがいつ必要になる可能性があるかを予測する手法です。同じエクステントからの 13 個の連続したページがバッファープール内に見つかった場合、InnoDB は、そのエクステントの残りのページのプリフェッチを行う要求を非同期に発行します。
ランダム先読み機能は、InnoDB Plugin
(バージョン 1.0.4) から削除されたため、InnoDB Plugin
が InnoDB
の「組み込みの」バージョンになった時点では MySQL 5.5.0 に含まれていませんでした。ランダム先読みは、innodb_random_read_ahead
構成オプション (デフォルトでは無効になっています) とともに、MySQL 5.1.59 および 5.5.16 以降でふたたび導入されました。この機能を有効にするには、構成変数 innodb_random_read_ahead
を ON
に設定します。
SHOW ENGINE INNODB STATUS
コマンドは、先読みアルゴリズムの有効性を評価するのに役立つ統計を表示します。統計には、Innodb_buffer_pool_read_ahead
および Innodb_buffer_pool_read_ahead_evicted
グローバルステータス変数のカウンタ情報が含まれます。これらの情報は、innodb_random_read_ahead
設定を微調整する場合に役立つことがあります。
また、MySQL 5.6 でランダム先読み機能が復活したことにより、SHOW ENGINE INNODB STATUS
コマンドには Innodb_buffer_pool_read_ahead_rnd
がふたたび含まれています。Innodb_buffer_pool_read_ahead
は、その現在の名前を維持しています。(以前のリリースでは、Innodb_buffer_pool_read_ahead_seq
として示されていました。)
I/O パフォーマンスの詳細は、セクション8.5.7「InnoDB ディスク I/O の最適化」およびセクション8.11.3「ディスク I/O の最適化」を参照してください。