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链表类似,是一个双向链表,在控制块中存在两个指针,分别指向上一个脏页和下一个脏页
原文地址:https://blog.csdn.net/weixin_40719943/article/details/135982466
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_64639.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!