1. 更新Buffer Pool中的数据时flush链表的作用是什么?
当我们在执行增删改查的时候,如果发现数据页没有被缓存,一定会基于free链表找到一个空闲的缓存页,然后将数据页读取到缓存页里,如果已经缓存了,就直接使用缓存页;无论怎样,都是在内存中直接执行增删改操作的。
一旦更新了缓存页中的数据,那缓存页中的数据和磁盘上的数据就不一致了,这个时候这个缓存页就是脏数据、脏页了
Buffer Pool中的脏缓存页最终是要被刷新回磁盘文件的,那刷新的时候,需要知道哪些缓存也需要被刷新,不会所有缓存页都刷新
数据库里面引入了一个和free链表类似的flush链表,本质也是通过缓存页的描述数据块中的两个指针,让被修改过的缓存页的描述数据块组成一个双向链表。
凡是被修改过的缓存页,都会把他的描述数据块加入到flush链表中去,flush的意思就是这也都是脏页,后续都是要flush刷新到磁盘上去的。
2. Buffer Pool中的缓存页不够用怎么办?
基于LRU算法淘汰缓存页,从磁盘加载一个数据页到缓存页的时候,这个缓存页的描述数据块会被放到LRU链表的头部,所以所有有数据的缓存页都会在LRU链表中,最近被加载的缓存页