阅读mysql LRU老化文档

This commit is contained in:
asahi
2024-11-22 13:01:06 +08:00
parent e00dbdc108
commit 5362e59e11

View File

@@ -125,4 +125,23 @@ show variables like 'innodb_old_blocks_pct'
默认情况下,`innodb_old_blocks_time`该值为1000单位为ms如果增加该值会使新页面更快的从缓冲区中淘汰。 默认情况下,`innodb_old_blocks_time`该值为1000单位为ms如果增加该值会使新页面更快的从缓冲区中淘汰。
#### page made young
在innodb LRU中使用了midpoint insertion的方法来对LRU列表进行管理。当需要将一个新的页添加到缓冲池时最近最少被使用的页将会从缓冲池中淘汰并且新的页将会被插入到midpoint位置。
midpoint将LRU列表分为了两部分
- young部分该部分为head到midpoint的部分默认占列表长度的5/8用于存放访问频繁的页
- old部分用于存放访问频率较少的页
默认情况下LRU通过如下算法管理缓冲池
- 3/8部分属于old sublist部分
- 当innodb读取页到缓冲池中时新读取的页将会被插入到midpoint位置。页可能因为如下原因被读取
- 由用户发起的操作例如sql查询
- 由innodb执行的read ahead操作
- 当访问old部分的页时`made young`即将页从old部分移动到young部分的头部。如果对old部分页的访问是由用户发起的操作那么那么该页面会被移动到young部分的头部
- 随着数据库的运行LRU中的young部分和old部分页面都会向LRU列表尾部移动这被称为`老化`。当其他页面触发`made young`操作时:
- 如果发生`made young`操作那么young部分和old部分的节点都会向后移动发生老化
- 如果由新页面被插入到midpoint那么只有old部分的节点会发生老化
#### FreeList
当数据库实例刚启动时LRU里列表中并没有任何页此时页都存放在Free List中。当要从缓冲池中获取页时首先查看Free List中是否有空闲的页`如果有则从FreeList中获取并将该页添加到LRU的midpoint位置``若Free List中没有空闲的页那么将根据LRU算法淘汰LRU尾部的页将淘汰页的内存空间分配给新的页。`