InnoDB存储引擎中的缓冲池管理1

InnoDB存储引擎是基于磁盘存储的,为了平衡CPU速度和磁盘速度之间的差距,引入了缓冲池。即通过一块内存区域来弥补磁盘速度较慢对数据库性能的影响。

缓冲池是一个比较大的内存区域,其中存放了各种类型的页。那么InnoDB存储引擎是如何对这块较大的内存进行管理的呢?
下面介绍几类算法。

改进的LRU

通常来说,数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的。
最频繁使用的页放在LRU 列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取的页时,将首先释放LRU列表的尾端的页。
在InnoDB存储引擎中,缓冲池中页的大小默认为16KB,也是使用LRU的算法进行管理,但稍有改进。
先介绍改进的LRU算法, 再来分析一下为何要这么做。

算法介绍

LRU列表加入了midpoint位置。新读取到的页,虽然是最新访问的页,但并不是直接放入到LRU列表的首部,而是放在LRU列表的midpoint位置。这个算法称为midpoint insertion strategy。默认情况下,该位置在LRU列表长度的5/8处。
通过命令show variables like ‘innodb_old_blocks_pct’来查看midpoint位置
这里写图片描述
由上图可知,默认值是37,表示新读取的页插入到LRU列表尾端的37%的位置(约3/8)。
把midpoint之后的列表称为old列表,之前的列表称为new列表。new列表中的页都是最为活跃的热点数据。

改进的原因

比如有一张数据量较大的表student
select * from student;
查询所有学生信息这类的操作很少,但偶尔还是有。这类操作我们需要访问表中的很多的页,但这些页只有在这次查询操作中才需要,并不是活跃的热点数据。如果我们把这些查出的页直接放在LRU列表的首部,则很有可能将所需要的热点数据页从LRU列表中移除,而下一次需要访问热点数据页时,InnoDB存储引擎需要再次访问磁盘,降低性能。

为了解决上述问题,InnoDB存储引擎引入了另一个参数innodb_old_blocks_time来进一步管理LRU列表。

innodb_old_blocks_time
表示页读取到mid位置后需要等待多久才会被加入到new端

通过命令set global innodb_old_blocks_time=*
进行设置,来使LRU列表中数据不被刷出

LRU列表是用来管理已经读取的页,但当数据库启动时,LRU列表是空的,还没有任何的页。这时页都存放在Free列表中。当需要从缓冲池中分页时,首先从Free列表中查找是否有可用的空闲页,若有则将该页从Free列表中删除,放入到LRU列表中。否则,根据LRU算法,淘汰LRU列表尾端的页,将该内存空间分配给新的页。当页从LRU列表的old部分加入到new部分时,称此时发生的操作为page made young,而因为innodb_old_blocks_time的设置而导致页没有从old部分移动到new部分的操作成为page not made young。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值