在之前的文章《从零开始带你成为MySQL实战优化高手学习笔记(二) 关于buffer pool的相关知识》中,已经简单的了解了的一些buffer pool的东西:free链表用来记录哪些缓存页是空的,flush链表记录哪些是被修改过的。
目录
1、缓存页满了怎么办?
但是,free链表总会有空的时候,也就是说缓存页都满了,再没有空余缓存用来加载磁盘上的数据页?
这时候我们想,怎么办?是不是要把一部分缓存页淘汰掉,也就是清空,然后再加载新的数据页到缓存页。
如何淘汰?
1.1、LRU淘汰算法
1.1.1、策略:
MySQL使用了LRU淘汰算法,LRU也就是least recently use,最近最少使用。
策略就是使用的缓存页就加到LRU链表的头部,只要修改或者查询过就会移到链表头部,最后淘汰LRU尾部的。
1.1.2、存在的问题:
1、MySQL有个预读机制:当从磁盘中加载一个数据页的时候,有可能会把相邻的数据页也一块加载到缓存页。
这会带来什么问题?
看上图,比如,空间大小就为4,原本ABC都是经常被访问的,现在要加入虚线那两个数据页,必须要淘汰一个,那肯定就淘汰C&#