read-ahead リクエストは、buffer pool の複数のページを非同期にプリフェッチするための I/O リクエストであり、これらのページの必要性が低下することが予想されます。 これらの要求によって、すべてのページが 1 つのエクステント内に移動されます。 InnoDB
では、I/O のパフォーマンスを向上させるために、次の 2 つの先読みアルゴリズムを使用します:
線形先読みは、順次にアクセスされているバッファープール内のページに基づいて、どのページがすぐに必要になる可能性があるかを予測する手法です。 InnoDB
が先読み操作を実行するタイミングを制御するには、構成パラメータ innodb_read_ahead_threshold
を使用して、非同期読取りリクエストのトリガーに必要な順次ページアクセスの数を調整します。 このパラメータが追加される前に、InnoDB
は、現行エクステントの最後のページを読み取ったときに、次のエクステント全体に対して非同期プリフェッチリクエストを発行するかどうかのみを計算します。
構成パラメータ innodb_read_ahead_threshold
は、InnoDB
が順次ページアクセスのパターンを検出する方法を制御します。 エクステントから順次読み取られるページ数が innodb_read_ahead_threshold
以上の場合、InnoDB
は次のエクステント全体の非同期先読み操作を開始します。innodb_read_ahead_threshold
は、0-64 の任意の値に設定できます。 デフォルト値は 56 です。 この値が大きいほど、アクセスパターンのチェックは厳密になります。 たとえば、値を 48 に設定すると、現在のエクステント内の 48 ページが順次アクセスされた場合にのみ、InnoDB
によって線形先読みリクエストがトリガーされます。 値が 8 の場合、エクステント内の 8 ページが順次アクセスされていても、InnoDB
は非同期先読みをトリガーします。 このパラメータの値は、MySQL configuration file で設定することも、グローバルシステム変数を設定するのに十分な権限を必要とする SET GLOBAL
ステートメントを使用して動的に変更することもできます。 セクション5.1.9.1「システム変数権限」を参照してください。
ランダム先読みは、すでにバッファープール内に存在するページに基づいて、これらのページが読み取られた順序には関係なく、ページがいつ必要になる可能性があるかを予測する手法です。 同じエクステントから 13 個の連続ページがバッファプールに見つかった場合、InnoDB
はエクステントの残りのページをプリフェッチするリクエストを非同期的に発行します。 この機能を有効にするには、構成変数 innodb_random_read_ahead
を ON
に設定します。
SHOW ENGINE INNODB STATUS
コマンドは、先読みアルゴリズムの有効性を評価するのに役立つ統計を表示します。 統計には、次のグローバルステータス変数のカウンタ情報が含まれます:
Innodb_buffer_pool_read_ahead
Innodb_buffer_pool_read_ahead_evicted
Innodb_buffer_pool_read_ahead_rnd
これらの情報は、innodb_random_read_ahead
設定を微調整する場合に役立つことがあります。
I/O パフォーマンスの詳細は、セクション8.5.8「InnoDB ディスク I/O の最適化」およびセクション8.12.1「ディスク I/O の最適化」を参照してください。