mysql innodb 之 buffer pool

1 buffer pool 是什么

buffer pool为内存中的一个数据块,主要由三部分组成:
1)缓存中的数据页–存储业务数据,大小和磁盘中的数据页大小一样,均为16K。
注:缓冲池和磁盘之间进行数据交换的单位是-数据页
2)数据描述区域,也称为控制块,记录缓存数据页的元数据信息:包括数据页所属表空间、数据页编号、数据页在buffer pool中的地址、锁信息、LSN信息等。控制块大小800K左右,为缓存页大小的5%左右。
3)三个链表:LRU链表、free链表、flush链表
其中,控制块和数据页一一对应

2.buffer pool 初始化

mysql server 启动后,按照比配置信息 innodb_buffer_pool_size 设置的值大一些的空间进行内存申请,
原因是多出的空间是为了存储控制块的信息。

3 修改缓冲池大小配置,配置参数 innodb_buffer_pool_size

更改此配置信息会修改缓冲池的大小,此操作是以块(chunk)的方式进行,一个chunk默认值为128M,
通过配置参数 innodb_buffer_pool_chunk_size 进行控制。因此,innodb_buffer_pool_size的设置应该为
innodb_buffer_pool_chunk_size的整数倍,且为了避免潜在的性能问题,innodb_buffer_pool_size/innodb_buffer_pool_chunk_size<1000(官方文档指出,原因未明)
innodb_buffer_pool_size = innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances*N(N>=1)

每次调整innodb_buffer_pool_size的大小,可以看成以innodb_buffer_pool_chunk_size为单位内存的增加或者释放。

4 缓冲池实例配置,配置参数 buffer pool instance

通过 innodb_buffer_pool_instances 来设置 buffer pool实例的个数
当可用内存足够大的时候,设置单个实例的buffer pool的内存区域尽管足够大,但是当多线程同时访问/操作同一个数据块时,
必然会加锁等待,导致性能降低。因此可以通过设置多个instance来缓解多线程处理时的性能问题。

5 链表介绍

5.1 free链表

当执行读写操作的时候硬盘中的数据页会加载到buffer pool的数据页中,当buffer pool中的数据页持久化到硬盘中时,
这些数据页又会被释放出来。
那么如何识别buffer pool中哪些数据页是空闲的,比较笨的方法是遍历所有的数据页,会造成性能问题。
而free链表则是用来记录buffer pool中所有的空闲数据页,free链表是一个双向链表,由每个数据页的控制块组成,每个控制块
有两个指针,free_pre:指向上一个空闲数据页,free_nexe:指向下一个空闲数据页

当某一空闲页加载数据后,则将该控制块对应的free节点从free链表中移除

5.2 LRU链表

innodb buffer pool对LRU算法进行了改进,将链表分为两块区域,一块是热区(高频访问的数据),
另一块是冷区(低频访问的数据)

5.3 flush链表

脏页:当执行写入操作时,首先会将数据写入到缓冲区,此时缓冲区的数据和磁盘中的数据不一致,不一致的数据页即为脏页。
产生了脏页,就要刷新磁盘–刷脏,那么如何确定那些缓冲区的数据页是脏页,将所有的数据页全部刷到磁盘中是一种解决方案,
但无疑是比较傻的,也比较消耗性能。
此时就用到flush链表,和free链表类似,是一个双向链表,在控制块中存在两个指针,分别指向上一个脏页和下一个脏页

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值