缓冲区管理器负责将可用的内存划分为缓冲区,缓冲区是与页面同等大小的区域,磁盘块的内容可以传递到缓冲区。
常用的两种算法:
1)LRU
LRU算法是淘汰最长时间没有读或者写过的块。这种方法要求缓冲区管理器按照页面最后一次被访问的时间组成一个链表,每次淘汰链表尾部的页面。
2)LIRS
LRU算法不能解决全表扫描的问题,将导致缓冲池中的大量页面被替换,从而污染缓冲池。现代数据库一般采用LIRS算法,将缓冲池分为两级,数据首先进入第一级,如果数据在较短的时间内被访问两次或者两次以上,则成为热点数据进入第二级,第一级内部还是采用LRU算法。Oracle的数据中的Touch count算法和MySql InnoDB中的替换算法使用类似的分级思想。以MySql InnoDB为例子,LRU链表分为两部分:新子链表和老子链表。默认情况下,前者占用5/8,后者占用3/8。页面首先插入老子链表,页面在老子链表停留的时间超过一定阈值,才能会转移到新链表。当出现全表扫描的时候,InnoDB会将页面数据载入到老子链表,在老子链表中停留时间不够,不会转移到新子链表中,避免了新子链表中的页面被替换出去的情况。