mysql read ahead

read ahead的功能出现于mysql 5.0 的版本,此前只有 sequence read ahead和 random read ahead两种,其目的是为了提高相应场景的读性能,其功能是由单独的后台线程完成的;在5.6 的版本当中又引进了新的方式:logical read ahead;需要注意一下:在mysql 5.5 的官方手册中,预读的两种方式是 linear read ahead 和 random read ahead,而在5.7中是 sequence read ahead 和 random read ahead,但是根据定义 linear 和 sequence应该是相同的,这里我们统称为liear read ahead;

  • linear read ahead

linearra

此种预读是指在读取数据时,如果会顺序的对一个extent的page进行读取时,其读取的page数量超过或者等于参数()值时,后台线程会将与此extent相邻的下一个extent 全部异步读取到bp中;当用户线程试图读取bp中的一个page时,此时就会触发此种预读,mysql会首先判断此page是否是此extent的边界,如果是会接着统计其所在的区有多少个page位于bp以及对它们的读取方式,如果位于bp的page 数量超过参数()值,此时就会执行异步预读;

  • random read ahead

randra

此种方式的预读是指在读取bp中的每个page时,都会观察其所在extent 有多少位于bp当中,并且如果当前extent中的位于bp的page 当中有超过一定数量的page 全部被访问,此时就会对当前extent 其余的page 进行预读;也就说随机预读针对的是当前的extent;

  • logical read ahead

logicalra

当表的碎片化比较严重时,即使是执行全表扫描,速度也会下降,此时如果执行 linear 预读 ,其效果也会打折,因为读取整个extent未必能提升读性能,因为extent中可能都是无效的page,此时逻辑预读就可以发挥作用了;逻辑预读的工作方式是:

1、读取 主键的INODE page

2、然后收集 叶子的page number

3、按照page number 的排序读取page,按照主键的排序读取行数据

这样可以尽可能多的保障每个读取的page 都是有效的数据页