MySQL buffer pool预读机制

预读机制的简单介绍

介绍预读机制首先要知道InnoDB引擎,他是现在版本MySQL的主要引擎,它将所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引,缓冲池用于高速缓冲数据和索引。

接下来正式介绍预读机制:

InnoDB在I/O的优化上相对之前有着独特的预读机制,预读机制就是发起一个i/o请求,异步地在缓冲池中预先回迁若干页面,预计将会用到回迁的页面,这些请求在一个范围内引入所有页面。InnoDB以64个page为一个extent,而page和extent则是接下来要介绍的两种预读算法的基本单位。

数据库发起数据请求,请求被提交到文件读取系统,放入相关请求队列中;读取进程从请求队列把请求取出,根据读取请求到相关的数据存储介质读取数据;返回数据,放入响应队列,最后数据库从响应队列中将数据取走,完成数据读取。


相关流程

接着进程继续处理请求队列,(如果数据库是全表扫描的话,数据读请求将会占满请求队列),判断后面几个数据读请求的数据是否相邻,再根据自身系统IO带宽处理量,进行预读,进行读请求的合并处理,一次性读取多块数据放入响应队列中,再被数据库取走。(如此,一次物理读操作,实现多页数据读取,rrqm>0(# iostat -x),假设是4个读请求合并,则rrqm参数显示的就是4)

InnoDB使用两种预读算法来提高I/O性能:线性预读(linear read-ahead)和随机预读(randomread-ahead)

  为了区分这两种预读的方式,我们可以把线性预读放到以extent为单位,而随机预读放到以extent中的page为单位。线性预读着眼于将下一个extent提前读取到buffer pool中,而随机预读着眼于将当前extent中的剩余的page提前读取到buffer pool中。

线性预读

线性预读方式有一个很重要的变量控制是否将下一个extent预读到buffer pool中,通过使用配置参数innodb_read_ahead_threshold,控制触发innodb执行预读操作的时间。

  如果一个extent中的被顺序读取的page超过或者等于该参数变量时,Innodb将会异步的将下一个extent读取到buffer pool中,innodb_read_ahead_threshold可以设置为0-64的任何值(因为一个extent中也就只有64页),默认值为56,值越高,访问模式检查越严格。

例如,如果将值设置为48,则InnoDB只有在顺序访问当前extent中的48个pages时才触发线性预读请求,将下一个extent读到内存中。如果值为8,InnoDB触发异步预读,即使程序段中只有8页被顺序访问。

  可以在MySQL配置文件中设置此参数的值,或者使用SET GLOBAL需要该SUPER权限的命令动态更改该参数。

  在没有该变量之前,当访问到extent的最后一个page的时候,innodb会决定是否将下一个extent放入到buffer pool中。

随机预读

随机预读方式则是表示当同一个extent中的一些page在buffer pool中发现时,Innodb会将该extent中的剩余page一并读到buffer pool中。

由于随机预读方式给innodb code带来了一些不必要的复杂性,同时在性能也存在不稳定性,在5.5版本以及之后中已经将这种预读方式废弃,默认是OFF。若要启用此功能,即将配置变量设置innodb_random_read_ahead为ON。

你可能感兴趣的:(MySQL buffer pool预读机制)