阅读mysql LRU老化文档
This commit is contained in:
@@ -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尾部的页,将淘汰页的内存空间分配给新的页。`
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user