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

相关推荐
大拇指的约定1 小时前
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(三),单表查询
数据库·mysql·oracle
银氨溶液2 小时前
MySql数据引擎InnoDB引起的锁问题
数据库·mysql·面试·求职
unix2linux4 小时前
Parade Series - SHA256
linux·python·mysql·shell
hefaxiang5 小时前
【MYSQL】mysql约束---自增长约束(auto_increment)
数据库·mysql
计算机学姐6 小时前
基于微信小程序的调查问卷管理系统
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
momo小菜pa16 小时前
【MySQL 06】表的增删查改
数据库·mysql
程序员大金19 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
gorgor在码农19 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql
-seventy-19 小时前
SQL语句 (MySQL)
sql·mysql
一般路过糸.19 小时前
MySQL数据库——索引
数据库·mysql