暂无图片
MySQL Read-Ahead预处理
最近更新:2022-03-11 14:21:05

预读从字面意义就能理解,就是通过一系列指标,判断先读取某些数据 加载到内存中,从而减少实时IO请求。数据库发展到目前,IO交互的代价还是最高的,特别是传统的机械硬盘下预读能力确实能提供性能。但前提是内存充裕,比如刚预读,数据还没有读取,内存容量不够,就得立即从缓存中淘汰掉,那就等于做了无用的事情。

了解预读能力之前,先回顾一下InnoDB逻辑存储单元主要分为表空间、段、区和页。层级关系为tablespace -> segment -> extent(64个page,1M) -> page(默认16kb)。 image.png innodb引擎对于数据页变更的操作是异步进行的,但对于读请求来说可以使read-time读之外,通过预读方式进行先加载策略。

1.Ahead-read

预读请求是指预取缓冲池中的多个页面的异步I/O请求,以预测这些页面即将出现的需求。请求在一个区段中引入所有页面。InnoDB使用两种预读算法来提高I/O性能:

  • Linear read-ahead(线性预读)是一种基于按顺序访问的缓冲池中的页面来预测可能很快需要哪些页面的技术。通过配置参数innodb_read_ahead_threshold,触发异步读请求所需的顺序页访问次数,来控制InnoDB执行预读操作的时间。在此之前,InnoDB只会在读取当前extent的最后一页时,计算是否对整个下一个extent发出异步预取请求。 例如,如果将该值设置为48,则只有在当前区段中有48个页面被连续访问时,InnoDB才会触发线性预读请求。
......