1.概念

  • 数据库会把查询到的数据加载到内存中,这块区域称为buffer pool
  • 数据库是以页存储的,默认每页是16k,buffer pool中也是按照页去存储的
  • 每个在bp中的页都有对应的描述信息,包含表空间数据页编号等信息
  • 加载到内存中的数据,增删改查都在内存中操作,有redolog保持数据回复性
  • 异步线程会去把脏页刷到硬盘里,刷新后变为干净页

image.png

Free表

Mysql维护了一个free链表来记录哪个缓存页是空闲的,当缓存也被使用时就从free链表中移除
image.png

缓存hash表

数据查询时,通过hash表来获取数据具体在哪个数据页image.png

Flush表

Mysql维护了一个Flush表来确定哪个页是脏页,再具体刷新到磁盘中,更新的数据放到头结点
image.png

LRU链表

当bf用完时,则会采用lru算法将最少使用缓存页也淘汰
但由于Mysql有预读机制,还有有可能全表扫描的情况,不能只简单维护一个链表(把最近使用的放到头结点)
image.png
为了避免上述情况,mysql将lru链表分young区和old区,比例7:3
image.png
数据刚被读到放到young区,如果一秒内再次读取,则会放到old区,