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区域对应的控制块。

相关推荐
用户83071968408215 小时前
MySQL 查询优化 30 条封神技巧:用好索引,少耗资源,查询快到飞起
mysql
Nyarlathotep011316 小时前
事务隔离级别
sql·mysql
Nyarlathotep011319 小时前
SQL的事务控制
sql·mysql
用户861782773651820 小时前
MySQL 8.0从库宕机排查实录:中继日志膨胀引发的连锁故障复盘
mysql
随风飘的云2 天前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
于眠牧北5 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
Turnip12027 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
加号37 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏7 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
WeiXin_DZbishe8 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5