天天看点

《DBNotes: Buffer Pool对于缓冲页的链表式管理》

目录

  • ​​Buffer Pool回顾​​
  • ​​Buffer Pool内部组成​​
  • ​​freelist​​
  • ​​flushlist​​
  • ​​LRU链表管理以及改进​​

Buffer Pool回顾

我们知道针对数据库的增删改删操作都是在Buffer Pool中完成的,一条sql的执行步骤可以认为是这样的:

1、innodb存储引擎首先在缓冲池中查询有没有对应的数据,有就直接返回

2、如果不存在,则去磁盘进行加载,并加入缓冲池

3、同时该记录会被加上独占锁,防止多人修改,出现数据不一致

而且我们知道,可以通过设置​

​my.cnf​

​​配置中的​

​innodb_buffer_pool_size​

​来修改缓冲池大小,加快sql查询速度,当然也需要注意设置过大会造成系统swap空间被占用,导致系统变慢降低查询性能。

Buffer Pool内部组成

缓冲池对应一片连续内存,我们将其划分为大小为16kb的页(与innodb对应),这些页称为缓冲页。

为了很好的管理这些页,设计者为每个缓冲页都创建了一些控制信息:表空间编号、页号、缓冲页在缓冲池中的地址、链表节点信息等。将每个页对应的控制信息占用的一块内存称为一个控制块。控制块与缓冲页一一对应,都存放在缓冲池中。

在Mysql启动时,会自己完成对缓冲池的初始化:向操作系统申请内存,自己划分成若干对控制块和缓冲页。

freelist

当我们从磁盘中load一个数据页到缓冲池中,我们应该放到哪个缓冲页中呢?

很显然我们应该把数据页放到“空闲”的缓冲页中。

设计者将所有空闲的缓冲页对应的控制块作为一个节点放到一个链表中,称为freelist。每次从freelist中取出一个空闲的缓冲页中,并且将该缓冲页对应的控制块信息填上,然后将该节点移除,表示缓冲页已经被使用了

flushlist

LRU链表管理以及改进