本文主要有以下内容:
Buffer Pool 结构介绍 Free、Flush、Lru 链表介绍
写下本文的原因主要是因为在总结事务相关知识的时候,提到了这一块的相关知识,本来打算 事务 + Buffer Pool 一起总结的,但是内容太多,就分成两篇!下周上事务相关的总结知识吧!
Buffer Pool
为什么需要 Buffer Pool:因为 CPU 和磁盘交互非常耗费时间,因此为了提高效率,会将数据页缓存在 Buffer Pool中,这样在继续访问相同的数据页时,便不会再从磁盘加载数据页。
Buffer Pool:是一片连续的内存空间,可以在启动MySQL时在 server 下通过此innodb_buffer_pool_size = 268435456指定,单位是字节,用于缓存数据页。
Buffer Pool 的内部结构
在 Buffer Pool 中,每一页的大小和数据页的大小一致,默认为 16 kb,每一个缓存页由一个控制块所控制。实际结构如下图:
由于是一片连续的内存空间,因此很有可能出现一块内存大小不足以满足 一个页的 + 控制块的大小,自然而然这片区域就没法用到。因此就被称为碎片区。
Free 链表
为了更好的管理这些缓存页,我们就必须先知道当前缓存页的状态,如是否空闲,当前缓存页是否被修改等,因此设计了 Free 链表,可以帮我们快速定位当前缓存页中哪些缓存页还没有被使用,是可以拿来使用的!其结构如下:
- 链表基结点:记录了链表开始的位置、结束的位置以及链表中节点的数量。占据 40 个字节。不包含在 buffer pool 申请的内存空间里。
- 每个