Mysql缓冲池

缓冲池

InnoDB引擎在读取页操作的时候,首先将从磁盘读取到的页放在缓冲池中,这个过程叫做“将页FIX到缓冲池中”,下一次在读取这个页,首先判断该页是否在缓冲池中,如果在,称该页面在缓冲池中命中,直接读取该页。否则,读取磁盘上的页。
对于数据库的修改操作,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。刷新磁盘的操作并不是实时触发,而是通过CheckPoint机制刷新回磁盘。
从InnoDB1.0.X版本开始,允许有多个缓冲池实例,每个页根据哈希值平均分配到不同缓冲池实例中,减少数据库内部的资源竞争,提高并发的能力。调整参数innodb_buffer_pool_instances来设置实例数量。
缓冲池很大,以G为单位。

缓冲池中的数据页类型

  • 索引页
  • 数据页
  • undo页
  • 插入缓冲
  • 自适应哈希索引
  • 锁信息
  • 数据字典信息等

缓冲池的管理:LRU List、Free List和Flush List

缓存池是通过LRU(最近最少使用)算法来进行管理的。最频繁使用的页放在LRU的前端,最少使用的放在后端。
缓存池中的页默认大小为16KB。

1.LRU List

数据库对LRU进行了优化,存在midponit位置,也就是说,最近访问的不会直接放到LRU的前端,而是放在一个midponit的位置,这样做的原因是为了避免某一次索引或者数据的扫描(一次性或偶尔性)导致真正的热点数据被移除。midpoint位置可以由参数innodb_old_blocks_pct来控制,默认37,也就是说midponit的位置是在LRU尾端的37%的位置。
避免热点数据的移除,还引入了一个参数innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会加入到LRU列表的热端。也就是被暂时放到了尾部,经过多久时间再回到热端。

2.Free List

当数据库刚刚启动的时候,LRU列表是空的,没有任何的页。这时页都存放在Free列表中。当需要从缓存池中分页时,首先从Free列表中查找是否有可用的页,若有则从Free列表中删除并放入到LRU列表中。否则根据LRU算法,淘汰列表末尾的页,将该内存空间分配给新的页。

3.Flush List

在LRU列表页被修改后,该页称为脏页。这时数据库会通过CHECKPOINT机制将脏页刷新回磁盘,Flush List列表中的页即为脏页列表。
注:脏页同时存在于LRU列表和Flush列表中,前者负责页的可用性,后者负责刷新到磁盘,互不影响。

4.页压缩

将原本的16KB的页压缩成1KB、2KB、4KB、8KB。通过unzip_LRU列表进行管理。对于压缩页的表,每个表的压缩比率可能各不相同,可能存在有的表页大小8K有的是2KB,unzip_LRU列表对不同压缩页大小的页分别管理。这时如何分配内存呢?
例如我们要从缓冲池申请页为4KB的大小,过程如下:

  • 检查4KB的unzip_LRU列表中是否有可用的空闲页。
  • 有,直接使用
  • 否,检查8KB的upzip_LRU列表
  • 能够获得空闲页,将页面分为2个4KB页,存放到4KB的unzip_LRU列表
  • 否,从LRU(注意不是unzip_LRU)列表申请一个16KB的页,将页分为1个8KB和2个4KB,分别存放到对应的unzip_LRU列表中

参考书籍:MySQL技术内幕 InnoDB存储引擎 第2版

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值