1.概念
- 数据库会把查询到的数据加载到内存中,这块区域称为buffer pool
- 数据库是以页存储的,默认每页是16k,buffer pool中也是按照页去存储的
- 每个在bp中的页都有对应的描述信息,包含表空间数据页编号等信息
- 加载到内存中的数据,增删改查都在内存中操作,有redolog保持数据回复性
- 异步线程会去把脏页刷到硬盘里,刷新后变为干净页
Free表
Mysql维护了一个free链表来记录哪个缓存页是空闲的,当缓存也被使用时就从free链表中移除
缓存hash表
Flush表
Mysql维护了一个Flush表来确定哪个页是脏页,再具体刷新到磁盘中,更新的数据放到头结点
LRU链表
当bf用完时,则会采用lru算法将最少使用缓存页也淘汰
但由于Mysql有预读机制,还有有可能全表扫描的情况,不能只简单维护一个链表(把最近使用的放到头结点)
为了避免上述情况,mysql将lru链表分young区和old区,比例7:3
数据刚被读到放到young区,如果一秒内再次读取,则会放到old区,
