InnoDB的Buffer Pool

缓存的重要性
即使只需要访问一个页的一条记录,也需要先把完整的页中的数据加载到内存中,将整个页的数据加载到内存中就可以进行读写访问了,而且在读写访问之后并不着急把该页的对应的内存空间释放掉,而是将其缓存起来,这样将来有请求再次访问该页面时,就可以省下磁盘I/O的开销了。

磁盘太慢,用内存作为缓存区很有必要。
Buffer Pool本质上是InnoDB向操作系统申请的一段连续的内存空间,可以通过innodb_buffer_pool_size来调整它的大小。
Buffer Pool向操作系统申请的连续内存空间由控制和缓存页组成,每个控制块和缓存页嗾使一一对应的。都填充了足够多的控制块和缓存页的组合后,Buffer Pool中剩余的空间可能不足以填充一组控制块和缓存页,从而导致这部分空间无法使用。这部分空间也称为碎片。
InnoDB使用了许多链表来管理Buffer Pool
free链表中,每一个节点都代表一个空闲的缓冲页,在将磁盘中的页加载到Buffer Pool中时,会从free链表中寻找空闲的缓冲页。
为了快速定位某个页是否被加载到Buffer Pool中,可使用表空间号+页号作为key,缓冲页控制块的地址作为value的形式来建立哈希表。
Buffer Pool中,被修改的页称为脏页,脏页并不是立即刷新的,而是加入到flush链表中,待之后某个时刻再刷新到磁盘中。
LUR链表分为young区和old区,可以通过innodb_old_blocks_pct来调节old区域所占的比例。首次从磁盘加载到Buffer Pool中的页会放到old区域的头部,在innodb_old_blocks_pct间隔时间内访问该页时,不会把它移动到young区域头部,在Buffer Pool中没用可用的空闲缓冲页时,会首先淘汰掉old区域中的一些页。
可以通过指定innodb_buffer_pool_instances来控制Buffer Pool实例的个数,每个Buffer Pool实例都有各自独立的链表,互不干扰。
MySQL 5.7.5版本之后,可以在服务器运行 过程中调整Buffer Pool大小,每个Buffer Pool实例由若干个chunk组成,每个chunk的大小可以在服务器启动时通过启动选项调整。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值