MySQL的LRU

发布时间 2023-10-03 15:38:21作者: kiper

image

在 InnoDB 实现上,按照 5:3 的比例把整个 LRU 链表分成了 young 区域和 old 区域。

图中 LRU_old 指向的就是 old 区域的第一个位置,是整个链表的 5/8 处。靠近链表头部的 5/8 是 young 区域,靠近链表尾部的 3/8 是 old 区域。

改进后的 LRU 算法执行流程变成了下面这样。
图 7 中状态 1,要访问数据页 P3,由于 P3 在 young 区域,因此和优化前的 LRU 算法一样,将其移到链表头部,变成状态 2。
之后要访问一个新的不存在于当前链表的数据页,这时候依然是淘汰掉数据页 Pm,但是新插入的数据页 Px,是放在 LRU_old 处。
处于 old 区域的数据页,每次被访问的时候都要做下面这个判断:

  1. 若这个数据页在 LRU 链表中访问的时间间隔超过了 1 秒,就把它移动到链表头部;
  2. 如果这个数据页在 LRU 链表访问的时间间隔短于 1 秒,位置保持不变。

1 秒这个时间,是由参数 innodb_old_blocks_time 控制的。其默认值是 1000,单位毫秒。