数据页访问流程:
1)当访问的页面在缓冲池中命中,直接返回该页。为了避免扫描LRU,innodb为每个instances维护了一个page hash,通过space id (表空间id)和 page no(当前页) 可以直接找到对应的page。一般情况下,当你需要读入一个page时,首先找到对应的instances,然后再查询 page hash,如果page hash 中没有,则需要从磁盘中读取;
2)如果没有命中,则需要把页面从磁盘加载到缓存,因此需要在缓存中找一个空闲的内存块来缓存这个页面;
3)如果空闲的内存块被使用完,也就是free 链表上没有内存块了。则需要在生产一个空闲的内存块;
4)首先去LRU列表中找到可以替换的内存页面,查找的方向时从尾部开始,如果找到可以替换的页面,将其从LRU列表摘除,加入空闲列表,然后再去空闲列表中找到空闲的内存块;
5)如果在LRU中没有找到可替换的页,则进行单页刷新,将脏页刷新到磁盘之后,再将释放的内存块加入到空闲列表,然后再去空闲列表去取。