(1)如果Buffer Pool中的缓存页不够了怎么办?
    当你不停的把磁盘上的数据页加载到空闲缓存页里去,free链表中不停的移除空闲缓存页,迟早有一瞬间,你会发现free链表中已经没有空闲缓存页了。这个时候当你还要加载数据页到一个空闲缓存页怎么办?
    16.png

    (2)如果要淘汰一些数据,淘汰谁?
    淘汰缓存页,就是把一个缓存页里被修改过的数据,给他刷到磁盘的数据页里去,然后这个缓存页就可以清空了。让他重新变成一个空闲的缓存页。
    当所有的缓存页都被塞满了,没有空闲缓存页了就淘汰掉一些缓存页,但是淘汰谁?缓存命中低的被刷到磁盘文件里去,假设一个缓存页被修改查询过一次,之后一段时间就没有使用过这个缓存页了,另一个缓存页经常被修改和查询。所以会首先刷新最近最少使用的缓存页到磁盘文件里去。
    17.png

    (3)引入LRU链表来判断哪些缓存页是不常用的?
    怎样知道哪些缓存页很少使用?使用LRU链表,LRU链表大致原理,假设加载一个数据页到缓存页的时候,就把这个缓存页的描述数据块放到LRU链表头部去,只要有数据的缓存页都会在LRU链表里,而且最近被加载数据的缓存页,都会放到LRU链表的头部去。再假设某个缓存页的描述数据块本来在LRU链表的尾部,后续被多次查询或者修改了数据页,这个缓存页的描述数据块就被移动到了LRU链表的头部去了。也就是说最近被访问过的缓存页,一定是在LRU链表头部的。
    然后缓存页没有一个是空闲的时候,就可以从LRU链表的尾部找到一个缓存页,这个缓存页一定是最近最少使用的,然后那个尾部的缓存页刷入磁盘,就可以把你需要的磁盘数据页加载到空闲缓存页中去了。
    18.png