1、基于冷热数据分离的思想设计LRU链表

真正MySQL在设计LRU链表的时候,采取的实际上是冷热数据分离的思想。真正的LRU链表,会被拆分为两个部分,一部分是热数据,一部分是冷数据,这个冷热数据的比例是由innodb old blocks pct参数控制的,他默认是37,也就是说冷数据占比37%。
image.png

2、冷热两个区域如何使用

数据页第一次被加载到缓存的时候,缓存页会被放在冷数据区域的链表头部。冷数据区域的缓存页什么时候会被放入到热数据区域?

Q:只要对冷数据区域的缓存页进行了一次访问,就立马把这个缓存页放到热数据区域的头部行不行? A:不合理,如果刚加载了一个数据页到那个缓存页,是在冷数据区域的链表头部,然后在1ms以内就访问了一下这个缓存页,之后就再也不访问他了,这种情况也要把那个缓存页放到热数据区域的头部吗?

MySQL设定了一个规则,他设计了一个innodb old blocks time参数,默认值1000,也就是1000毫秒也就是说,必须是一个数据页被加载到缓存页之后,在1s之后(说明后续很可能会经常要访问它),访问这个缓存页,它才会被挪动到热数据区域的链表头部去。

对于预读以及全表扫描加载进来的一大堆缓存页,首先放在LRU链表的冷数据区域的前面。在冷数据区域里的缓存页,在1s之后还被人访问了,那么此时就会判定为未来可能会被频繁访问的缓存页,然后移动到热数据区域的链表头部去。

3、LRU链表的热数据区域是如何进行优化的?

a.在热数据区域中,如果你访问了一个缓存页,要不要把他立马移动到热数据区域的链表头部去?
热数据区域里的缓存页可能是经常被访问的,这么频繁的进行移动性能并不是太好,也没这个必要。

LRU链表的热数据区域的访问规则被优化了一下,即你只有在热数据区域的后3/4部分的缓存页被访问了,才会给你移动到链表头部去。如果你是热数据区域的前面1/4的缓存页被访问,他是不会移动到链表头部去的。