Mysql中的buffer pool

859 阅读3分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

引言:mysql为了避免频繁从磁盘中读写数据,在Innodb引擎中提出了buffer pool的概念。此外buffer pool也是mysql中比较重要的一个组件,接下来让我们来好好的了解下buffer pool这个组件。

什么是buffer pool

引言中已经提到,mysql为了避免频繁访问磁盘数据提出了buffer pool的概念,buffer pool允许从内存直接访问常用的数据,以此提高处理的速度。

举个例子,比如查询的时候,mysql读取数据后不直接返回而是将数据保存到buffer pool中后再返回,这样下一次查询的时候就可以直接从buffer pool中读取数据。

当然buffer pool的作用并不仅仅局限于此,其实现以及内部结构还是蛮复杂的。

buffer pool的内部结构

buffer pool差不多是数据库的一个内存组件(可以理解为是一片内存数据结构),其内部主要由 free 链表flush 链表以及 LRU链表组成。buffer pool默认大小为128Mb。

buffer pool的数据管理单位

buffer pool是数据库的一个内存组件,必定要进行数据管理,那么其数据管理的单位是什么呢?显然不可能是一条一条的sql语句。其数据管理其实是按来进行管理的,存放在buffer pool中的页被称为缓存页。其大小和磁盘默认的页大小相同均为16kb,此外每个缓存页都有相应的控制块,用来存储内存页的描述信息。其结构类似下图:

image.png

其中包含这些东西:数据页所属的表空间数据页编号缓存页在Buffer Pool中的地址等。每个缓存页里面会由对应的描述信息,这些缓存页的描述信息也是数据,并存储在Buffer Pool的最前部,而缓存页则放在后面

数据页

数据库的核心数据模型是:表+字段+行,所以mysql对数据抽象出了数据页的一个概念。数据页是数据的一个集合,一个数据页里面存储了多行数据。其结构大致如下图所示:

image.png

buffer pool解决了什么问题

说完了上面的buffer pool的内部结构,我们在说一说buffer pool到底实现了什么。先直接上图:

image.png 在操作数据库的时候,有一个比较麻烦的问题就是数据库宕机崩溃,那么就会导致内存中更新了的数据丢失,mysql为了应对这个问题在innodb中加入了redo log机制,你在进行数据库增删改操作时候,它把你操作的记录复制一份写入到redo log中。具体步骤参照上述图片中的第四步到第八步。这样一来,就算你数据库崩溃了,重启后mysql也能从redo log日志文件里面读取你之前做过的操作并进行还原。

结语:今天的buffer pool的介绍到此结束!