Buffer Pool
- 概念
- free链表
- flush链表
- LRU链表
- chunk
概念
MySQL在启动时向操作系统申请的一片连续的内存,默认128M。然后将这块内存分为一个一个缓冲页(16KB,因为页就是16KB的)。再为每个缓冲页创建对应的控制块用于管理。比如第一次查询数据之后,数据库中对应的数据页就加载到缓冲页,第二次查询就不用去数据库了,直接内存查到返回。
free链表
由空闲的缓冲页的控制块组成的链表,新增的时候就在这里面找空闲的内存
flush链表
由修改过的缓冲页(脏页)的控制块组成的链表。
问:那什么时候将脏页数据同步到数据库呢?
答:1、后台线程根据系统的繁忙程度,定时从flush链表刷新一部分到磁盘
2、当加载数据到缓冲池,发现没有空闲缓冲页时;先看LRU链表尾部是否有非脏页控制块(用户读取 的有可能是未刷新到磁盘上的脏页);也没有的话,会强制刷新LRU链表最后一个对应的缓冲页
3、后台线程定时扫LRU链表尾部的一些缓冲页控制块,发现脏页就刷新磁盘
LRU链表
用户查询过的缓冲页的控制块组成的链表,最新访问的在最前面。所以分为热区和冷区(37%)
问:但是预读与全表扫描会破坏这种设计,怎么做呢?
答:其实二者的整个过程分 加载和读两个过程,二者都会加载,加载的时候都是加载到冷区的头部。而预读不一定会读,但全表扫一定会读,所以提供了判断全表扫的规则:即当前后访问一个页的时间间隔<1000ms(默认),数据就不会去加载到热区
chunk
chunk和buffer pool都允许有多个,用完一个chunk再用下一个