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列表的尾部进行淘汰。