今天和大家分享一下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。当需要使用一个数据页的时候,会通过表空间号+数据页号去哈希表里查一下,如果有,就说明存在缓存。