Buffer Pool本质上是InnoDB向操作系统申请的一段连续的内存空间,可以通过innodb_buffer_pool_size来调整它的大小。 Buffer Pool内部组成:Buffer Pool向操作系统申请的连续内存由控制块和缓
Buffer Pool本质上是InnoDB向操作系统申请的一段连续的内存空间,可以通过innodb_buffer_pool_size来调整它的大小。
Buffer Pool内部组成:Buffer Pool向操作系统申请的连续内存由控制块和缓存页组成,每个控制块和缓存页都是一一对应的,在填充足够多的控制块和缓存页的组合后,Buffer Pool剩余的空间可能产生不够填充一组控制块和缓存页,这部分空间不能被使用,也被称为碎片。InnoDB使用了许多链表来管理Buffer Pool。
Free链表:free链表中每一个节点都代表一个空闲的缓存页,在将磁盘中的页加载到Buffer Pool时,会从free链表中寻找空闲的缓存页。
链表基节点:Mysql通过基节点管理free链表,mysql为基节点单独申请了40字节的空间,不包含在Buffer Pool内
缓存页查询与定位:为了快速定位某个页是否被加载到Buffer Pool,使用表空间号 + 页号作为key,缓存页作为value,建立哈希表。
Flush链表:在Buffer Pool中被修改的页称为脏页,脏页并不是立即刷新到磁盘上,而是被加入到flush链表中,待之后的某个时刻同步到磁盘上。
LRU链表:通过最近最少使用原则淘汰缓存页,释放缓存空间,使用到某个缓存页,就把该缓存页调整到LRU链表头部,尾部为最近最少使用缓存页。
InnoDB预读机制:
其他的一些链表:
数据库后台专门线程负责将LRU链表尾部的部分脏页和Flush链表中的脏页刷新到磁盘。
Buffer Pool特别大且多线程并发访问量高,单一的Buffer Pool可能会影响请求的处理速度,因此当Buffer Pool特别大的时候,可以把它们拆分成若干小的Buffer Pool,可以通过指定innodb_buffer_pool_instances来控制Buffer Pool实例的个数,每个Buffer Pool实例中都有各自独立的链表,互不干扰。
自Mysql 5.7.5版本之后,可以在服务器运行过程中调整Buffer Pool大小。每个Buffer Pool实例由若干个chunk组成,每个chunk的大小可以在服务器启动时通过启动参数调整。由于基节点的原因,实际空间比chunk要大5%。
innodb_buffer_pool_size必须是innodb_buffer_pool_chunk_size × innodb_ buffer_pool_instances的倍数,且MySQL会根据一定的逻辑自动调节大小
查看Buffer Pool的状态信息:SHOW ENGINE INNODB STATUSG
--结束END--
本文标题: InnoDB Buffer Pool
本文链接: https://www.lsjlt.com/news/6304.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0