要了解 buffer pool 如何管理 page 页,首先要了解 page 页的分类

Page页的分类

page 页根据状态可以分为三种类型,如下图:

buffer pool如何管理page页_数据

  • free page:空闲 page,未被使用过
  • clean page:被使用 page,数据没有被修改过
  • dirty page:脏页,被使用的 page,数据被修改过。数据和磁盘数据不一致

Page页如何管理

针对三种不同类型的 page 页,InnoDB 通过三种链表结构来维护和管理

free list -- 管理 free page

  • free list:表示空闲缓冲区,管理 free page
  • free 链表是把所有空闲的缓冲页对应的控制块作为一个个的节点放到一个链表中,这个链表便称之为 free 链表
  • 基节点: free链表中只有一个基节点是不记录缓存页信息(单独申请空间),它里面就存放了free链表的头节点的地址,尾节点的地址,还有free链表里当前有多少个节点。
  • 当一个控制块所指定的页被使用,那么这个控制块将会被移除
  • 当一个页空闲出来了,会新增一个控制块记录这个页

buffer pool如何管理page页_链表_02

flush list -- 管理 dirty page

  • 表示需要刷新到磁盘的缓冲区,管理 dirty page,内部时间按照修改时间排序
  • InnoDB 引擎为了提高处理效率,在每一次修改缓冲页之后,并不是立刻把修改同步到磁盘上,而是在未来的某个时间点来进行刷新操作。
  • 所以需要使用flush list链表来存储脏页,凡是被修改过的缓冲区对应的控制块都会作为节点加入到 flush list链表中。
  • 其结构和 free list 相似

lru list -- 管理 clean page 和 dirty page

  • 缓冲区分为两个部分
  • midpoint 为基点
  • 前面的链表称为 new 列表区,存放经常访问的数据,占 63%
  • 后面的链表称为 old 列表区,存放较少使用的数据,占 37%

buffer pool如何管理page页_数据_03