1. freelist
freelist 标记的是buffer pool中未被使用区域的页列表,当有新的查询到来,查询结果有新的页数据时,会先从freelist中找到未被使用的页区域,然后将查询结果页放入该区域,并从freelist中删除该页标记。
2 flushlist
当buffer pool中的页里面有数据被修改,则该页变为脏页,数据库并不会立即将该页数据修改后的结果立即持久化到磁盘,而是会将该页标记加入flushlist的中(最前面),mysql后台线程会定时将flushlist标记的buffer pool中的脏页进行持久化到磁盘,持久化后删除flushlist节点
3 lru
a. buffer pool大小总有上限,当mysql一直查询总会超过其大小,这时候就需要有内存淘汰机制来保证buffer pool不会溢出,lru就是为了淘汰使用频率最小和使用时间最久远的页而生,当新增查询,有新的页缓存到buffer pool中时,就会将新的页标记放入lru列表的最前面,当buffer pool不够时,就会从lru列表最后面进行淘汰。
b. 为了防止全表扫描等容易对buffer pool影响很大的查询操作,mysql将 lrm列表分为热数据区和冷数据区,热冷分表赞比5/8和3/8. 当查询结果页第一次被查询时,会将该页标记放入冷数据区,当第二次查询该页时如果两次查询的时间差大于1s(全表扫描时,同一页的数据前后时间差很短,远小于1s),则将该页的标记放入热数据区,这样做防止了全表扫描对整个buffer pool进行刷新覆盖。
4. 三种列表的数据结构如下图,都是包含 基节点和控制块节点