#### 15.8.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)

[]()[]()[]()[]()[]()

 A [read-ahead](glossary.html#glos_read_ahead) request is an I/O request to prefetch multiple pages in the [buffer pool](glossary.html#glos_buffer_pool) asynchronously, in anticipation of impending need for these pages. The requests bring in all the pages in one [extent](glossary.html#glos_extent). `InnoDB` uses two read-ahead algorithms to improve I/O performance:

**Linear** read-ahead is a technique that predicts what pages might be needed soon based on pages in the buffer pool being accessed sequentially. You control when `InnoDB` performs a read-ahead operation by adjusting the number of sequential page accesses required to trigger an asynchronous read request, using the configuration parameter [`innodb_read_ahead_threshold`](innodb-parameters.html#sysvar_innodb_read_ahead_threshold). Before this parameter was added, `InnoDB` would only calculate whether to issue an asynchronous prefetch request for the entire next extent when it read the last page of the current extent.

 The configuration parameter [`innodb_read_ahead_threshold`](innodb-parameters.html#sysvar_innodb_read_ahead_threshold) controls how sensitive `InnoDB` is in detecting patterns of sequential page access. If the number of pages read sequentially from an extent is greater than or equal to [`innodb_read_ahead_threshold`](innodb-parameters.html#sysvar_innodb_read_ahead_threshold), `InnoDB` initiates an asynchronous read-ahead operation of the entire following extent. [`innodb_read_ahead_threshold`](innodb-parameters.html#sysvar_innodb_read_ahead_threshold) can be set to any value from 0-64. The default value is 56. The higher the value, the more strict the access pattern check. For example, if you set the value to 48, `InnoDB` triggers a linear read-ahead request only when 48 pages in the current extent have been accessed sequentially. If the value is 8, `InnoDB` triggers an asynchronous read-ahead even if as few as 8 pages in the extent are accessed sequentially. You can set the value of this parameter in the MySQL [configuration file](glossary.html#glos_configuration_file), or change it dynamically with the [`SET GLOBAL`](set-variable.html) statement, which requires privileges sufficient to set global system variables. See [Section 5.1.9.1, “System Variable Privileges”](system-variable-privileges.html).

**Random** read-ahead is a technique that predicts when pages might be needed soon based on pages already in the buffer pool, regardless of the order in which those pages were read. If 13 consecutive pages from the same extent are found in the buffer pool, `InnoDB` asynchronously issues a request to prefetch the remaining pages of the extent. To enable this feature, set the configuration variable [`innodb_random_read_ahead`](innodb-parameters.html#sysvar_innodb_random_read_ahead) to `ON`.

 The `SHOW ENGINE INNODB STATUS` command displays statistics to help you evaluate the effectiveness of the read-ahead algorithm. Statistics include counter information for the following global status variables:

* [`Innodb_buffer_pool_read_ahead`](server-status-variables.html#statvar_Innodb_buffer_pool_read_ahead)

* [`Innodb_buffer_pool_read_ahead_evicted`](server-status-variables.html#statvar_Innodb_buffer_pool_read_ahead_evicted)

* [`Innodb_buffer_pool_read_ahead_rnd`](server-status-variables.html#statvar_Innodb_buffer_pool_read_ahead_rnd)

 This information can be useful when fine-tuning the [`innodb_random_read_ahead`](innodb-parameters.html#sysvar_innodb_random_read_ahead) setting.

 For more information about I/O performance, see [Section 8.5.8, “Optimizing InnoDB Disk I/O”](optimizing-innodb-diskio.html) and [Section 8.12.1, “Optimizing Disk I/O”](disk-issues.html).

