BufferPool
结构:与数据页一致都是16k
控制块
- 一个控制块对应一个缓冲页
free链表
- 启动mysql服务器时初始化,一个控制块对应一个缓存页,控制块的链表
- 获取缓冲数据时,先获取空虚的控制块,再填充上数据
缓存页HASH
- 表空间号 + 页号为key,查找缓存页
flush链表
- 更新的数据先存在内存中,定时同步到内存
- 因为频繁往磁盘写会影响性能
LRU链表
缓存LRU策略
- 普通LRU已知问题(对比传统LRU) a. 如果全表查询,会将在头部的热点数据全部替换一遍 b. mysql预读, 顺序访问一个区的页面数量超过固定值、缓存了某个区13个页面, 将这个区下的数据全部加载到缓存区
- 划分区域的LRU b问题解决方式:链表总分为两个区域,一个是young区,一个是old区,预读的数据放在old区,再次使用才放到young区 a问题解决方式:因为全表扫描后数据先进入old区后也会被立即使用,所以有个规定,如果在1ms内数据被再次访问不会加入young区
- 不想频繁的移动头部节点,只有访问的缓存页位于young区域1/4处,才会放到头部