预读请求是一个 I/O 请求,用于异步预取 缓冲池中的多个页面 ,以预期对这些页面的迫在眉睫的需求。请求在一定程度上引入了所有页面 。 InnoDB
使用两种预读算法来提高 I/O 性能:
线性预读是一种基于缓冲池中按顺序访问的页面预测很快可能需要哪些页面的技术。您可以通过使用配置参数调整触发异步读取请求所需的顺序页面访问次数来控制何时InnoDB
执行预读操作 innodb_read_ahead_threshold
。在添加该参数之前,InnoDB
只会在读取当前extent的最后一页时计算是否对整个nextextent发出异步预取请求。
配置参数 innodb_read_ahead_threshold
控制InnoDB
检测顺序页面访问模式的敏感程度。如果从一个extent顺序读取的page数大于等于 innodb_read_ahead_threshold
, 则InnoDB
启动后续整个extent的异步预读操作。 innodb_read_ahead_threshold
可以设置为 0-64 之间的任何值。默认值为 56。值越高,访问模式检查越严格。例如,如果您将该值设置为 48,则InnoDB
仅当当前范围中的 48 个页面已按顺序访问时才会触发线性预读请求。如果值为 8,InnoDB
即使按顺序访问范围内少至 8 个页面,也会触发异步预读。您可以在 MySQL配置文件中设置该参数的值,或者通过语句动态更改它 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”。