1、Buffer Pool内存数据结构
Buffer Pool大概长这个样子:
对于每个缓存页,都会有一个描述信息,这个描述信息可以认为是用来描述这个缓存页的,包含如下的一些东西:
- 数据页所属的表空间
- 数据页的编号
- 这个缓存页在Buffer Pool中的地址
- …
每个缓存页都会对应一个描述信息,这个描述信息本身也是一块数据,在Buffer Pool中,每个缓存页的描述数据放在最前面,各个缓存页放在后面。
Buffer Pool中的描述数据大概相当于缓存页大小的5%左右,每个描述数据大概是800个字节左右的大小。假设设置的buffer pool大小是128MB,实际上Buffer Pool真正的最终大小会超出一些,可能有130多MB,因为还要存放每个缓存页的描述数据。
2、数据是如何放在Buffer Pool中的?
数据库的核心数据模型是表+字段+行,MySQL对数据抽象出来了一个数据页的概念,把很多行数据放在了一个数据页里,也就是说磁盘文件中会有很多的数据页,每一页数据里放了很多行数据。
假设要更新一行数据,此时数据库会找到这行数据所在的数据页,然后从磁盘文件里把这行数据所在的数据页直接给加载到Buffer Pool,也就是说,Buffer Pool中存放的是一个一个的数据页,如下图。
3、磁盘上的数据页和Buffer Pool中的缓存页是如何对应起来的?
默认情况下,磁盘中数据页的大小是16KB,即一页数据包含了16KB的内容。Buffer Pool中存放的数据页,通常叫做缓存页,Buffer Pool默认情况下,一个缓存页和磁盘上的一个数据页的大小,是1:1对应起来,都是16KB。
4、如何配置Buffer Pool的大小?
Buffer Pool默认是128MB,生产环境下可以对Buffer Pool进行调整。详见下一篇《实际生产环境中 Buffer Pool 如何设置》
5、数据库启动的时候,是如何初始化Buffer Pool的?
数据库只要一启动,就会按照置的Buffer Pool大小,稍微再加大一点,去操作系统申请一块内存区域,作为Buffer Pool的内存区域。
当内存区域申请完毕之后,数据库会按照默认的缓存页的16KB的大小以及对应的800个字节左右的描述数据的大小,在Buffer Pool中划分出来一个一个的缓存页和一个一个的他们对应的描述数据。当数据库把Buffer Pool划分完毕之后,看起来就如上图所示。
只不过这个时候,Buffer Pool中的一个一个的缓存页都是空的,里面什么都没有,等数据库运行起来之后,当要对数据执行增删改查的操作的时候,才会把数据对应的页从磁盘文件里读取出来,放入Buffer Pool中的缓存页中。
