普通的LRU算法
LRU = Least Recently Used(最近最少使用): 就是末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰.
- 当要访问某个页时,如果不在Buffer Pool,需要把该页加载到缓冲池,并且把该缓冲页对应的
控制块作为节点添加到LRU链表的头部。 - 当要访问某个页时,如果在Buffer Pool中,则直接把该页对应的控制块移动到LRU链表的头
部 - 当需要释放空间时,从最末尾淘汰
普通LRU链表的优缺点
优点: 所有最近使用的数据都在链表表头,最近未使用的数据都在链表表尾,保证热数据能最快被获取到。
缺点:
如果发生全表扫描(比如:没有建立合适的索引 or 查询时使用select * 等),则有很大可能
将真正的热数据淘汰掉.
由于MySQL中存在预读机制,很多预读的页都会被放到LRU链表的表头。如果这些预读的页
都没有用到的话,这样,会导致很多尾部的缓冲页很快就会被淘汰。
改进型LRU算法
改性LRU:链表分为new和old两个部分,加入元素时并不是从表头插入,而是从中间midpoint位
置插入(就是说从磁盘中新读出的数据会放在冷数据区的头部),如果数据很快被访问,那么page就
会向new列表头部移动,如果数据没有被访问,会逐步向old尾部移动,等待淘汰。