From e00dbdc1082c5ed89a2e35e4e2e94b628b86fda6 Mon Sep 17 00:00:00 2001 From: asahi Date: Thu, 21 Nov 2024 12:56:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBmysql=20LRU=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 | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index acb62fb..1295e85 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -95,5 +95,34 @@ show variables like 'innodb_buffer_pool_size' > ##### 将innodb_buffer_pool_size设置为9G > 由于9G不是2G的整数倍,那么innodb_buffer_pool_size将会被自动调整到10G,10G是2G的整数倍 +### LRU List, Free List, Flush List +缓冲池是一块由页构成的内存区域。 + +innodb中缓冲池通过LRU算法来进行管理,LRU中最频繁使用的页放在最前端,而较少使用的页放在最尾端。当缓冲池中内存已满,不能存放新读取到的页时,会释放LRU尾端较少使用的页。 + + +innodb中,`页大小默认为16KB`. + +#### midpoint +在LRU中,新读取的页,`并不放在LRU的首部,而是放在midpoint的位置,该算法被称为midpoint insertion strategy`。 + +默认情况下,midpoint位于`5/8`的位置,离首部5/8, 离尾部3/8。在innodb中,将`首部 -> midpoint`部分的页称之为new列表,`midpoint -> 尾部`部分称之为old列表。 + +midpoint位置可以通过`innodb_old_blocks_pct`来进行控制,默认情况下该值为`37`。 + +```sql +show variables like 'innodb_old_blocks_pct' +``` +结果为 + +|Variable_name|Value| +|-------------|-----| +|innodb_old_blocks_pct|37| + +引入midpoint的原因是防止在进行数据扫描等操作时,热点数据被淘汰。 + +此外,innodb还引入了`innodb_old_blocks_time`变量来管理LRU列表,代表LRU列表在被读取到midpoint位置后,需要经过多久时间才能被加入到`LRU的new部分`。 + +默认情况下,`innodb_old_blocks_time`该值为1000(单位为ms),如果增加该值,会使新页面更快的从缓冲区中淘汰。