InnoDB存储引擎的缓冲池管理2

LRU list,Free list,Flush list

通过show engine innodb status来观察LRU列表和free列表的使用情况和运行状态
InnoDB存储引擎的缓冲池管理2

由截图可以看出,当前的Buffer pool size共有512个页,即512*16K,总共8MB的缓冲池。Free buffers表示当前Free列表中页的数量,Database pages表示LRU列表中页的数量。
截图中Free buffers + Database pages != Buffer pool size
因为缓冲池中的页还可能会被分配给自适应哈希索引、Lock信息、Insert buffer等页,而这些不需要LRU算法进行维护。

注意:执行命令show engine innodb status;显示的不是当前的状态,而是过去某个时间范围内InnoDB存储引擎的状态。
可以看到No buffer pool page gets since the last printout

从InnoDB1.2版本开始,可以通过表INNODB_BUFFER_POOL_STAT来观察缓冲池的运行状态。
执行 select * from information_schema.INNODB_BUFFER_POOL_STATS;
InnoDB存储引擎的缓冲池管理2

当没有执行任何数据库操作时,
InnoDB存储引擎的缓冲池管理2

当对某个数据库中的表进行任意sql操作后,比如select * from zlj.book;
InnoDB存储引擎的缓冲池管理2

我们还可以通过INNODB_BUFFER_PAGE_LRU来观察每个LRU列表中每个页的具体信息。
InnoDB存储引擎的缓冲池管理2

InnoDB存储引擎从1.0x版本开始支持压缩页的功能,即将原来16KB的页压缩为1KB,2KB,4KB,8KB。对于非16KB的页,是通过unzip_LRU列表进行管理的。
LRU中的页是包含了unzip_LRU列表中的页。

unzip_LRU是怎么样从缓冲池中分配内存的呢?
首先,在unzip_LRU列表中对不同压缩页大小的页进行分别管理。其次,通过伙伴算法进行内存的分配。

查看unzip_LRU列表中页
select TABLE_NAME,SPACE,PAGE_NUMBER,COMPRESSED_SIZE from
information_schema.INNODB_BUFFER_PAGE_LRU where COMPRESSED_SIZE<>0;

在LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页的数据产生了不一致。这时数据库会通过checkpoint机制将脏页刷新回磁盘,而Flush列表中页即为脏页列表。需要注意的是,脏页既存在于LRU列表中,也存在于Flush列表中。LRU列表用来管理缓冲池中页的可用性,Flush列表用来管理将页刷新回磁盘,二者互不影响。

通过show engine innodb status,得到的
Modified db pages 0 就显示了脏页数量为0