普通LRU算法
LRU算法介绍
LRU = Least Recently Used(最近最少使用):也就是末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰数据。
1.当要访问某个页时,如果不在Buffer Pool中,需要把该页加载到缓冲池,并且把该缓冲页对应的控制块作为节点添加到LRU链表的头部。
2.当要访问某个页时,如果在Buffer Pool中,则直接把该页对应的控制块移动到LRU链表的头部。
3.当需要释放空间时,直接从末尾淘汰。
普通LRU算法的优缺点
优点:
1.所有最近使用的数据都在链表表头,最近未使用的数据都在链表表尾,保证热数据能最快被获取到。
缺点:
1.如果发生全表扫描(如使用select * 等),则有很大可能将真正的热数据淘汰掉。
2.由于MySQL中存在预读机制,很多预读的页都会被放到LRU链表的表头。如果这些预读的页都没有使用到的话,就会导致很多尾部的缓冲页很快被淘汰掉。
改进型LRU算法
改进型LRU:将链表分为new和old两个部分,在添加新数据时并不是从表头插入,而是从中间midpoint位置插入数据(也就是从磁盘中新读出的数据会放在冷数据区的头部),如果数据很快就被访问了,那么page就会移动到new链表头部,如果数据没有被访问,会逐步向old尾部移动,直到淘汰。
冷数据区的数据页什么时候会被转到热数据区呢?
1.如果该数据页在LRU链表中存在的时间超过1s,就将其移动到链表头部(链表指的是整个LRU链表)
2.如果该数据页在LRU链表中存在的时间短于1s,其位置不变(由于全表扫描有一个特点,就是它对某个页的频繁访问总耗时会很短)
3.1s这个时间是由参数 innodb_old_blocks_time 控制的。