阅读mysql LRU文档

This commit is contained in:
asahi
2024-11-21 12:56:01 +08:00
parent 785b694479
commit e00dbdc108

View File

@@ -95,5 +95,34 @@ show variables like 'innodb_buffer_pool_size'
> ##### 将innodb_buffer_pool_size设置为9G
> 由于9G不是2G的整数倍那么innodb_buffer_pool_size将会被自动调整到10G10G是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如果增加该值会使新页面更快的从缓冲区中淘汰。