image.png
InnoDB 为了缓存磁盘中的页,在 MySQL 服务器启动的时候就向操作系统申请了一片连续的内存,他们给这片内存起了个名,叫做 Buffer** **Pool(中文名是缓冲池)。那它有多大呢?这个其实看我们机器的配置,默认情况下 Buffer Pool 只有 128M 大小,这个值其实是偏小的。

  1. show variables like 'innodb_buffer_pool_size';

image.png
可以在启动服务器的时候配置 innodb_buffer_pool_size 参数的值,它表示
Buffer Pool 的大小,就像这样:

  1. [server]
  2. innodb_buffer_pool_size = 268435456

其中,268435456 的单位是字节,也就是指定 Buffer Pool 的大小为 256M。需要注意的是,Buffer Pool 也不能太小,最小值为 5M(当小于该值时会自动设置成 5M)。

Buffer Pool 内部组成

Buffer Pool 中默认的缓存页大小和在磁盘上默认的页大小是一样的,都是16KB。为了更好的管理这些在 Buffer Pool 中的缓存页,InnoDB 为每一个缓存页都创建了一些所谓的控制信息,这些控制信息包括该页所属的表空间编号、页号、缓存页在 Buffer Pool 中的地址、链表节点信息、一些锁信息以及 LSN 信息,当然还有一些别的控制信息。
每个缓存页对应的控制信息占用的内存大小是相同的,我们称为控制块。控制块和缓存页是一一对应的,它们都被存放到 Buffer Pool 中,其中控制块被存放到 Buffer Pool 的前边,缓存页被存放到 Buffer Pool 后边,所以整个 Buffer Pool 对应的内存空间看起来就是这样的:
image.png
每个控制块大约占用缓存页大小的 **5%**,而我们设置的innodb_buffer_pool_size 并不包含这部分控制块占用的内存空间大小,也就是说InnoDB 在为 Buffer Pool 向操作系统申请连续的内存空间时,这片连续的内存空间一般会比 innodb_buffer_pool_size 的值大 5%左右。