缓冲池(Buffer Pool)介绍
Buffer Pool 是数据库的一个内存组件,里面缓存了磁盘上的真实数据,Java系统对数据库的增删改操作,主要是这个内存数据结构中的缓存数据执行的。
1.缓冲池的大小
Buffer Pool的默认大小是128M。在实际的生产环境中可以通过参数innodb_buffer_pool_size对 buffer pool进行调整。
2.数据页
数据库的核心数据模型是表 + 字段 + 行的概念。 数据库对数据抽象出一个数据页的概念,将很多行的数据放到一个数据页中。即磁盘中有很多数据页,每个数据页存放很多行数据。
当要更新一行数据的时候,数据库会找到这行数据所在的数据页,然后从磁盘文件中把这行数据所在的数据页加载到 Buffer Pool 中。即Buffer Pool中存放的是一个一个的数据页。
3.缓存页
默认情况下,磁盘中存放的数据页的大小是16KB,即一页数据包含16KB的内容。
Buffer Pool中存放的一个一个的数据页,通常叫做缓存页。(Buffer Pool是一个缓冲池,里面的数据是从磁盘缓存到内存中的)
Buffer Pool中默认情况下,一个缓存页的大小和磁盘上一个数据页的大小是一一对应的,都是16KB。
4.缓存页的描述信息
每个缓存页,都会有一个描述信息,这个描述信息可以认为是用来描述这个缓存页的。比如包含:这个数据页所属的表空间、数据页的编号、这个缓存页在Buffer Pool中的地址以及其他信息。
描述信息也可以叫描述数据、控制数据、元数据等。
描述信息本身也是一块数据,在Buffer Pool中,每个缓存页的描述数据放在最前面,然后各个缓存页放在后面。如下图所示:
需要注意的一点是:
Buffer Pool中的描述数据大概是缓存页大小的 5% 左右,也就是每个描述数据大概是800个字节左右的大小。
假设设置的Buffer Pool大小是128MB,实际上Buffer Pool真正的最终大小会超出一些,可能会有130多MB大小,因为还要存放每个缓存页的描述信息。
5.Buffer Pool可能存在的内存碎片
Buffer Pool的大小是人为设定的,很可能划分完所有的缓存页和描述数据块之后,还剩一点点的内存,这一点点内存放不下任何一个缓存页了,就没办法使用了,也就变成了内存碎片。
同时,再划分缓存页和描述数据块的时候,会让它们紧密的挨在一起,这样能尽可能的减少内存浪费,就尽可能的减少内存碎片的产生了。
如果缓存页东一块西一块,必然有很多间隙,就形成了内存碎片。
6.Buffer Pool的初始化
数据库启动的时候,会按照Buffer Pool设置的大小,加上描述数据的大小,去申请一块内存作为Buffer Pool的内存区域。
当内存区域申请之后,数据库就会按照默认的缓存页的16KB的大小和800字节左右的描述数据的大小,在Buffer Pool中划分出一个一个的缓存页和一个一个对应的描述数据。
此时,Buffer Pool中一个一个的缓存页都是空的,等数据库运行起来之后,要进行增删改查的操作时,才会把数据对应的数据页从磁盘文件中读取出来,放入Buffer Pool中的缓存页中。