Buffer Pool

58 阅读2分钟

Buffer Pool

定义

Buffer Pool是MySQL服务器启动时向操作系统申请的一片连续内存,用于缓存磁盘中的页。每个缓存页都有对应的控制信息,包括表空间编号、页号、缓存页地址、链表节点信息、锁信息、LSN(日志序列号)信息。

组成

  1. 缓存页大小: 默认为16KB,与磁盘上的默认页大小相同。
  2. free链表: 存储空闲的缓存页,通过控制块组成链表。当需要加载页时,从free链表中选择一个空闲的缓存页,将其控制块信息填充,表示该缓存页已被使用。
  3. flush链表: 存储被修改过的缓存页的控制块信息,用于刷新到磁盘。
  4. 哈希处理: 使用表空间号 + 页号作为key,缓存页作为value创建哈希表,提高访问速度。
  5. LRU链表: 用于按最近最少使用原则淘汰缓存页。被使用的缓存页移至链表头部,链表尾部为最近最少使用的缓存页。

划分区域的LRU链表

为了解决全表扫描和线性预读导致的LRU链表频繁淘汰高频使用的缓存页问题,引入了划分区域的LRU链表:

  1. young区域: 存储使用频率高的缓存页,位于LRU链表的前部。
  2. old区域: 存储使用频率较低的缓存页,位于LRU链表的后部。 这样可以提高缓存命中率,减少频繁淘汰高频使用缓存页的情况。

刷新脏页到磁盘

后台有专门的线程负责定期将脏页刷新到磁盘,以避免影响用户线程的正常请求。刷新脏页的来源包括LRU链表的old区域和flush链表。

通过这些机制,Buffer Pool在高效利用内存的同时,保证了数据的一致性和持久性。