预读请求是一个 I/O 请求,用于异步地预取缓冲池中的多个页面,以预测对这些页面的迫切需求。这些请求将一个区中的所有页面都引入。 InnoDB
使用两种预读算法来提高 I/O 性能
线性预读是一种技术,它根据按顺序访问缓冲池中的页面来预测很快可能需要哪些页面。您可以通过调整触发异步读取请求所需的连续页面访问次数来控制InnoDB
何时执行预读操作,方法是使用配置参数 innodb_read_ahead_threshold
。在添加此参数之前,InnoDB
只会在读取当前区的最后一页时才计算是否为整个下一个区发出异步预取请求。
配置参数 innodb_read_ahead_threshold
控制InnoDB
在检测顺序页面访问模式方面的敏感度。如果从一个区顺序读取的页面数大于或等于 innodb_read_ahead_threshold
,则InnoDB
会启动对整个后续区的异步预读操作。 innodb_read_ahead_threshold
可以设置为 0-64 之间的任何值。默认值为 56。值越高,访问模式检查越严格。例如,如果将该值设置为 48,则InnoDB
仅在顺序访问了当前区中的 48 个页面时才触发线性预读请求。如果该值为 8,即使顺序访问的区中页面数少至 8 个,InnoDB
也会触发异步预读。您可以在 MySQL 配置文件中设置此参数的值,也可以使用 SET GLOBAL
语句动态更改它,这需要足以设置全局系统变量的权限。请参阅第 7.1.9.1 节“系统变量权限”。
随机预读是一种技术,它根据缓冲池中已有的页面来预测何时可能需要这些页面,而不管读取这些页面的顺序如何。如果在缓冲池中找到来自同一个区的 13 个连续页面,则InnoDB
会异步发出请求以预取该区的其余页面。要启用此功能,请将配置变量 innodb_random_read_ahead
设置为 ON
。
SHOW ENGINE INNODB STATUS
语句显示统计信息,以帮助您评估预读算法的有效性。统计信息包括以下全局状态变量的计数器信息
此信息在微调 innodb_random_read_ahead
设置时非常有用。
有关 I/O 性能的更多信息,请参阅第 10.5.8 节“优化 InnoDB 磁盘 I/O” 和第 10.12.1 节“优化磁盘 I/O”。