InnoDB之LRU的改进

为什么不采用朴素的LRU算法,直接将读取的页放入到LRU列表的首部呢?

因为若直接读取到的页放入到LRU的首部,那么某些SQL操作可能会使缓冲池中的页被刷新出,从而影响缓冲池的效率。常见的这类操作为索引或数据的扫描操作。这类操作需要访问表中的许多页,甚至是全部的页,而这些页通常来说又仅在这次查询操作中需要,并不是活跃的热点数据。如果页被放入LRU列表的首部,那么非常可能将所需要的热点数据页从LRU列表移除,而在下一次需要读取该页时,InnoDB存储引擎需要再次访问磁盘。

解决方案:InnoDB存储引擎引入了另一个参数来进一步管理LRU列表,这个参数是Innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。

### Innodb 内存结构组成 Innodb 的内存结构设计旨在提升数据库操作效率并支持高效的并发访问。主要组成部分包括 Buffer Pool、Change Buffer 和 Adaptive Hash Index 等。 #### Buffer Pool Buffer Pool 是 InnoDB 存储引擎中最核心的缓存组件,用于缓存表数据和索引页面[^1]。其大小可以通过配置参数 `innodb_buffer_pool_size` 进行调整。为了更好地管理这些缓存的数据页,Buffer Pool 实现了一套复杂的机制: - **LRU 列表**:采用双向链表形式维护所有缓冲区中的页面,按照最近最少使用的顺序排列。当新页面进入时会加入到头部;而当空间不足时,则淘汰尾部最久未被访问过的页面。 - **辅助列表**:除了 LRU 列表外还有其他类型的子列表帮助更精细地控制某些特定场景下的替换策略,比如防止热数据过早被淘汰等。 ```sql SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; ``` #### Change Buffer Change Buffer 主要用来暂存对次级索引(Secondary Indexes)所做的更改操作,直到相关记录所在的聚簇索引页加载至 Buffer Pool 中为止。这样可以减少随机 I/O 并提高写入性能[^2]。 #### Adaptive Hash Index (AHI) Adaptive Hash Index 动态创建哈希索引来加速查询速度。如果发现某个范围内的频繁查找模式,InnoDB 可能会在该区域建立 AHI 来代替传统的 B+Tree 查找方式,从而加快检索过程[^4]。 --- ### 工作原理 整个 InnoDB 内存结构的工作流程围绕着如何高效利用有限的物理 RAM 资源展开: - 当应用程序发起读请求时,先尝试从 Buffer Pool 获取所需数据; - 如果命中则直接返回结果集给客户端应用层; - 若不命中即发生 Cache Miss 后,需将对应磁盘上的区块载入 Buffer Pool,并根据 LRU 或者改进后的算法决定移除哪些旧条目腾出位置; - 对于更新类的操作同样遵循类似的路径,不过涉及到了脏页标记以及后续刷回磁盘的过程。 通过上述机制,InnoDB 不仅能够显著降低磁盘 IO 开销,还能够在多线程环境下提供良好的响应时间和吞吐量表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值