目录

【MySQL】预读机制

预读机制

预读机制是相对于Innodb存储引擎而言的。

所谓预读机制,就是在加载数据页时,可能会将相邻数据页一起预先加载到buffer pool中,之后读取时就可以直接从内存获取,不必从磁盘读入。

使用Innodb的预读机制,可以减少磁盘IO次数,提高读写性能。

预读模式

Innodb一共提供了两种预读模式:

  • 线性预读:判断当前extend中的数据是否被连续访问,从而决定是否把下一个extend从磁盘中读出来,加载到buffer pool。
  • 随机预读:判断当前extend中被读取的page个数,从而决定是否把当前extend的数据全部加载到buffer pool中。

线性预读

MySQL5.5之后,默认使用的是线性预读模式,与之有关的配置为innodb_read_ahead_threshold,这个参数表示,当前extend中,如果有超过innodb_read_ahead_threshold个page被连续访问,就预加载相邻的extend的数据。

innodb_read_ahead_threshold的默认参数是56,最大为64,最小为0。如果为0,表示关闭线性预读。在关闭了线性预读的情况下,如果随机预读没有显式打开,就不会使用随机预读。

innodb组织数据的顺序为tablespace, segment, extend, page, row,因为extend固定为1MBpage默认为16KB,一个extend能容纳64个page,所以innodb_read_ahead_threshold最大为64。

预读原理

  • 连续访问,是根据page的最新一次访问时间来判断的。

  • 如果当前page是extend的第一个,则看后面的63个page,如果访问时间连续递减的个数,大于等于innodb_read_ahead_threshold,就加载上一个extend。

  • 如果当前page是extend的最后一个,则看前面的63个page,如果访问时间连续递增的个数,大于等于innodb_read_ahead_threshold,就加载下一个extend。

随机预读

MySQL5.5之后,随机预读是默认关闭的。

与随机预读有关的配置为innodb_random_read_ahead