From 5362e59e1192a745c8ac7ef668374f8693290a16 Mon Sep 17 00:00:00 2001 From: asahi Date: Fri, 22 Nov 2024 13:01:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBmysql=20LRU=E8=80=81=E5=8C=96?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/innodb体系结构.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index 1295e85..742e752 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -125,4 +125,23 @@ show variables like 'innodb_old_blocks_pct' 默认情况下,`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尾部的页,将淘汰页的内存空间分配给新的页。`