关于Mysql的Buffer Pool详解(一)

今天和大家分享一下Mysql中关于Buffer Pool的相关知识

1.首先大家需要知道Buffer Pool是什么?有什么作用?

我们都知道Mysql里的数据,最终都会落到磁盘文件上的,但是我们对数据库进行增删改操作的时候,不可能直接操作磁盘数据,因为如果对磁盘文件进行随机读写操作的话,那速度是相当慢的,不可能支撑高并发的场景。因此mysql的增删改查操作都是对内存数据进行操作的,然后再将内存数据更新到磁盘。而这个内存组件就是buffer pool。下面我们就简单介绍一下update操作,在InnoDB引擎中的执行流程,来看下buffer pool在其中起到了什么作用:
在这里插入图片描述
1.当我们更新一条数据的时候,会先查buffer pool中是否有对应的那条数据,如果没有,就会到磁盘中查询,并将其写入到buffer pool中,提高后续的操作性能。
2.在更新缓存数据之前,mysql会将修改前的数据写入undo log日志,用作数据记录。
3.将buffer pool里的缓存数据更新成最新数据。
4.将修改后的数据及修改了哪行数据等信息记录到redo log buffer中。
5.准备提交事务,将redo log buffer里的数据落盘。
6.将修改信息写入binlog日志中。
7.将binlog日志文件名称和这次更新的binlog日志文件位置都写入redo log日志中,并写入一个commit标识到redo log日志中。此时事务结束。
8.Mysql会有一个后台IO线程,会在之后的时间里,随机的将内存里修改的数据写入磁盘中。

通过上图的分析,我们可以明确的了解Buffer Pool在Mysql中的作用:
所谓的buffer pool其实就是mysql中的一个缓存组价,里面存放了磁盘中的真实数据。我们对数据库执行的增删改操作,其实都是对buffer pool里的缓存数据进行修改,之后再由后台IO线程将缓存数据同步到磁盘中

由此可见,Buffer Pool对Mysql的重要性不言而喻,因此我们最好能够详细了解他。

2.Buffer Pool是如何缓存数据的呢?他内部的结构又是什么样的呢?我们下面就详细了解下Buffer Pool的内部构造。

废话少说,上图:

在这里插入图片描述

Buffer Pool的数据结构如上图所示,内部有两种数据结构,一个是描述信息,另一个是缓存页。描述信息会在缓存页的前面,每一个描述信息也是一个数据块,里面记录了缓存页的数据,例如数据页所属的表空间、数据页的编号、这个缓存页在buffer pool的存储地址等等。

如果现在需要查出一条id=10的数据,那么在磁盘读取的时候,并不只读取一条数据,而是找到id=10那条数据所在的数据页,然后将这个数据页全部加载到缓存中(一个数据页是16kb)。同时会生成一个描述信息,记录缓存页的部分数据。

3.那么mysql是如何知道需要查询的数据是否有缓存呢?

在这里插入图片描述

实际上数据库是有一个哈希表数据结构,里面是用的表空间号+数据页号当做key,缓存页地址当做value。当需要使用一个数据页的时候,会通过表空间号+数据页号去哈希表里查一下,如果有,就说明存在缓存。

下一篇将会讲解Buffer Pool的free链表、flush链表和LRU算法淘汰机制,LRU链表的冷热数据分离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值