MySQL 中读页缓冲区 buffer pool
Buffer pool
我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待 CPU 对数据进行处
理。我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓
存起来,所以 MySQL 有这个 buffer pool 对页面进行缓存。
首先 MySQL 在启动时会向操作系统申请一段连续的内存空间,这一段空间就是作为
buffer pool 所用。将缓存的页放入 buffer pool 中管理起来。
mysql> show variables like ‘innodb_buffer_pool_size’;
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set, 1 warning (0.00 sec)
我们可以看到默认是 134217728 字节,即 128MB。一个页面是 16KB,我们申请 16KB 倍
数的缓存区大小就不会产生碎片。
buffer pool 组成
同时呢,在 buffer pool 中还有包含每个页面的控制信息,即控制块。每个控制块对应管理
每一个页面 (我们使用地址引用每一个页面) ,控制块用来存储页面的一些信息,控制块的
占用大小不包括在 innodb_buffer_pool_size 中。由 MySQL 在启动时自己额外申请空间。
在控制块和缓存页中间会有部分碎片,就是空间无法全部利用的产生的碎片。因为 MySQL
向操作系统申请的内存空间需要申请一定大小的控制块空间,不能确定具体的大小,难免回
有无法利用的空间。
free 链表
free 链表顾名思义,就是管理空闲的缓存页的链表,如果缓存页没有被使用,其控制块就
会连接到 free 链表上。