目录
一、BufferPool的概述
- 一、BufferPool的概述
- 二、什么是BufferPool
- 三、如何判断一个页是否在Buffer Pool中被缓存
- 无论是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的。
- 所谓表空间,只不过是InnoDB对一个或几个实际文件的抽象。也就是说,我们的数据说到底还是存储在磁盘上的。
- 但是磁盘读取速度很慢,所以如果需要访问某个页的数据时,InnoDB会把完整的页中的数据全部加载到内存中。即使只需要访问一个页里面的一条记录,也需要先把整个页的数据加载到内存中。然后就可以在内存中对记录进行读写访问了。
- 在读写访问之后,并不着急把该页对应的内存空间释放掉,而是将其缓存起来,如果将来再次访问该页面,就可以减少I/O的开销了。
- 为了缓存磁盘中的页,MySQL服务器启动时就向操作系统申请了一片连续的内存空间,他们给这片内存起名为——Buffer Pool(缓冲池)。
- 默认Buffer Pool只有128M,可以在启动服务器的时候配置innodb_buffer_pool_size(单位为字节)启动项来设置自定义缓冲池大小。
- Buffer Pool对应的一片连续的内存被划分为若干个页面,默认也是16KB。该页面称为缓冲页。
- 为了更好的管理Buffer Pool中的这些缓冲页,InnoDB为每个缓冲页都创建了控制块。它与缓冲页是一一对应的。
- 控制块存放到Buffer Pool的前面,缓冲页存放到Buffer Pool的后面,如下所示:
- 其实是存在缓冲页的哈希表的。 key=表空间号+页号 value=缓冲页控制块
- 当需要访问某个页的数据时,先从哈希表中根据表空间号+页号看看是否存在对应的缓冲页。
- 如果有,则直接使用;如果没有,就从free链表中选出一个空闲的缓冲页,然后把磁盘中对应的也加载到该缓冲页的位置。