Buffer Pool

一.Buffer Pool的含义

Buffer Pool:缓冲池,简称BP,其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。当Mysql执行查询的sql语句的时候,会先去缓存当中看是否有对应的数据,如果有则直接读内存,如果没有则去磁盘里拿,然后把数据放到Buffer Pool里拿,来提高查询速度。

Buffer Pool由缓存数据页(page)和对缓存数据页进行描述的数据块组成,控制块中存储着对应缓存页的所属的表空间、数据页的编号、以及对应缓存页在Buffer Pool中的地址等信息

BufferPool默认大小是128M,以Page页为单位,Page页默认大小16k,而控制块的大小约为数据页的5%,大概是800字节

二.InnoDB如何管理Page页

Page页分类

BP的底层是采用链表数据结构管理Page.在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。

如图就是Buffer Pool大体的结构图

Page一共有3中状态

free page:空闲page,不被使用

clean page:被使用page,数据从来没有被修改过

dirty page:脏页,被使用page,数据被修改过,但是还没有持久化到磁盘,Page页中数据和磁盘的数据产生了不一致

Page页如何管理

针对上面的3中Page类型,InnoDB通过三种链表结构来维护和管理

1.free list:表示空闲缓冲区,管理free page

free链表是把所有空闲的缓冲页对应的控制块作为一个个节点放到一个链表中,这个链表叫做free链表,free链表只有一个基节点是不记录缓存页信息(单独申请空间),它里面存放了free链表的头结点的地址,尾结点的地址,还有free链表当前有多少个节点

2.flush list 里面存放的都是脏页(Buffer Pool里面已经修改了,但是还没有持久化到磁盘),内部page按修改时间排序

InnoDB引擎为了提高处理效率,在每次修改缓冲页之后,并不是立刻把修改刷新到磁盘上,而是在未来的某个时间点进行刷新操作,所以需要使用flush链表存储脏页,所有被修改过的缓冲页对应的控制块都会作为节点加入到flush链表中

3.Iru list: 表示正在使用的缓冲区,缓冲区分为两部分,前面链表称为new列表区,存放经常访问的数据,后面的链表区称为old链表区,存放使用较少的数据

当一个新的数据页要被插入到BufferPool中的时候,会先删掉old区域最后一个控制块,然后把新的数据页插入到old区域最前头,当这个数据页第二次被访问且与第一次被访问超过1s,就会把old区域数据页加到new区域,并删掉在old区域对应的控制块。

相关推荐
刀法如飞3 小时前
开箱即用的 DDD(领域驱动设计)工程脚手架,基于 Spring Boot 4.0.1 和 Java 21
java·spring boot·mysql·spring·设计模式·intellij-idea
zbguolei3 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
luoluoal6 小时前
基于python大数据的电影市场预测分析(源码+文档)
python·mysql·django·毕业设计·源码
conca6 小时前
Java+MySQL时区难题-Date自动转换String差8小时
数据库·mysql
壹米饭6 小时前
MYSQL进阶:删除视图时视图被lock解决方案
后端·mysql
oMcLin7 小时前
如何在Ubuntu 22.04 LTS上配置并优化MySQL 8.0分区表,提高大规模数据集查询的效率与性能?
android·mysql·ubuntu
一路向北⁢8 小时前
MySQL 5.7 表分区使用说明(视频系统实战)
mysql·分区·分表·表分区
齐鲁大虾9 小时前
SQL Server 和 MySQL的区别
数据库·mysql
东方巴黎~Sunsiny10 小时前
mysql大表空间整理注意点
数据库·mysql
AllData公司负责人11 小时前
AllData数据中台-数据同步平台集成开源项目Seatunnel-Web,完成Mysql到Doris同步流程
数据库·mysql·开源