Buffer Pool

1 为什么要有Buffer Pool

如果没有Buffer Pool,所有的操作都是随机IO,每秒钟可以支撑的请求取决于IOPS,最多几百,而且响应时间也会很感人。因此,为了提高MySQL支持的并发数和快速响应,引入了Buffer Pool。

2 Buffer Pool的简单图解

实际上,在对数据库进行增删改查操作的时候,都是针对内存中的Buffer Pool中的数据进行的。下面给出了Buffer Pool的简单示意图,Buffer Pool默认是128M,可以通过参数innodb_buffer_pool_size进行设置。数据页的大小是16KB,而描述元数据页的大小约为数据页的5%,大概是800字节。

Buffer Pool由缓存数据页和对缓存数据进行描述的元数据页组成。

3 Buffer Pool缓存页的管理

内存缓存的大小一定是有限的,那么针对缓存页一般就会有管理的策略,针对空闲页的管理,脏页的置换,以及如何页淘汰等。

3.1 free链表

为了从磁盘载入数据页,需要在Buffer Pool中寻找空闲页,为了方便查找,针对空闲页使用空闲链表来维护。

3.2 flush链表

如果数据页被修改过,成为了脏页,那么为了保证数据的一致性,脏页是需要被flush到磁盘上去的,因此MySQL中使用flush链表来管理脏页。

3.3 页淘汰

如果Buffer Pool的数据页不够用了,那么就需要将Buffer Pool中的数据页进行淘汰。那么问题是使用怎样的缓存页淘汰策略,一般情况下都是使用经典的LRU算法。

因此,Buffer Pool针对缓存页还会维护一个LRU链表,只要查询或者修改了这个缓存页的数据,那么就会将该缓存页挪到LRU链表的头部。当空闲页不够用的时候,从LRU列表的尾部进行淘汰。

posted @ 2020-05-31 22:13  zerodseu  阅读(290)  评论(0编辑  收藏  举报