当前位置: 首页 > news >正文

MySQL Buffer Pool深度解析:当缓存页不足时如何基于LRU算法进行淘汰 - 详解

MySQL Buffer Pool深度解析:当缓存页不足时如何基于LRU算法进行淘汰 - 详解

1. 问题引入:free链表空了怎么办?

在之前的文章中,我们详细讲解了MySQL Buffer Pool中缓存页的划分、free链表的管理,以及数据页从磁盘加载到缓存页的过程。今天我们来分析一个更实际的问题:当Buffer Pool中的空闲缓存页用完时,系统该如何处理?

1.1 缓存页耗尽的必然性

随着数据库持续运行,不断有数据页从磁盘加载到Buffer Pool中:

磁盘数据页 → 查找free链表 → 获取空闲缓存页 → 加载数据

当free链表耗尽时,新的数据页将无法加载,此时必须淘汰部分现有缓存页

2. 淘汰策略:该把谁"请"出内存?

2.1 什么是淘汰缓存页?

淘汰缓存页是指:

  1. 将被修改过的缓存页数据刷新到磁盘(如果它是脏页)
  2. 清空该缓存页
  3. 将其重新加入free链表,变为可用状态

这个过程确保了内存资源的循环利用,但引出一个关键问题:应该淘汰哪些缓存页?

3. 核心指标:缓存命中率

为了做出最优淘汰决策,MySQL引入了缓存命中率的概念:

场景访问频率命中率评估淘汰优先级
缓存页A100次请求中30次访问高命中率保留
缓存页B加载后仅访问1次,后续100次请求无访问低命中率优先淘汰

核心原则:优先淘汰"占着茅坑不拉屎"的缓存页——即那些长期不被访问却占用内存资源的页面。

4. LRU链表:智能淘汰的指挥官

4.1 LRU基本概念

MySQL通过LRU链表(Least Recently Used,最近最少使用)来实现智能淘汰:

工作原理:最近被访问的缓存页移动到链表头部,久未访问的页面自然沉降到尾部。

4.2 LRU链表运作机制

数据加载时

当从磁盘加载数据页到缓存页:

  • 将该缓存页的描述信息块放入LRU链表头部
  • 表示这是最新被使用的页面
[新加载的缓存页] → LRU Head → ... → LRU Tail
数据访问时

当查询或修改某个已存在的缓存页:

  • 无论该缓存页在LRU链表的哪个位置
  • 立即将其移动到链表头部
  • 表示它刚被访问过,近期可能再次被访问
LRU Tail中的缓存页被访问 → 移动到LRU Head
淘汰决策时

当需要腾出空闲缓存页:

  • 直接从LRU链表尾部选取
  • 尾部的页面就是"最近最少使用"的页面
  • 将其刷新到磁盘后清空

5. 技术图解

图1:free链表耗尽的场景

Buffer Pool (128MB)
┌─────────────────────────────────────┐
│ [数据] [数据] [数据] ... [数据]          │
│ 缓存页  缓存页  缓存页      缓存页      │
└─────────────────────────────────────┘▲│ 无法加载新数据页│
磁盘文件 ────────────→ X (无空闲缓存页)

图2:LRU链表驱动的淘汰流程

1. 识别LRU链表尾部页面(最少使用)↓
2. 如果是脏页,刷新到磁盘↓
3. 清空缓存页,加入free链表↓
4. 加载新数据页到腾出的空间↓
5. 新页面插入LRU链表头部

6. 思考题解答:表/行 vs 表空间/数据页

问题:SQL中的表、行与表空间、数据页之间是什么关系?

答案

  • 逻辑概念:表、列、行——面向开发者的抽象,关注数据结构
  • 物理概念:表空间、数据页——面向存储的实现,关注数据在磁盘的组织方式

类比

就像你看一本书,只关注"章节"和"段落"(逻辑),而不必关心"纸张"和"印刷墨迹"(物理)。数据库自动将逻辑结构映射为物理存储。

7. 总结要点

  1. free链表耗尽是常态:持续的数据加载必然导致空闲页用完
  2. LRU是淘汰依据:通过访问时间戳智能判断页面热度
  3. 头部-尾部机制:热点数据在头部,冷数据自然沉降尾部
  4. 性能保障:确保内存中保留的都是高价值数据,最大化缓存命中率

系列预告:下一篇文章将深入探讨MySQL LRU算法的优化细节,包括如何解决"全表扫描污染缓存"等经典问题。

参考资料:《MySQL专栏》

版权说明:本文内容整理自狸猫技术窝MySQL专栏,仅供学习交流使用。

http://www.jsqmd.com/news/263867/

相关文章:

  • 内存管理-MMU
  • 1.18假期记录
  • 区间dp
  • STM32-S57-烟雾浓度+温度+人体防盗报警+水泵+风扇+TFT彩屏+阈值+声光报警+(无线方式选择)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 综述《导航定位与授时》封面丨飞行器视觉导航新时代——从地形匹配到空间智能 - MKT
  • STM32-S184-车位感应+停车引导+闸道控制+车道防夹+计时计费+结算+OLED屏+声光报警+按键+(无线方式选择)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫
  • AI Agent在智能新闻事件检测中的应用
  • 【六杆】基于matlab六杆快速回归机制运动学和动力学分析【含Matlab源码 14990期】
  • 应用——基于 51 单片机的多功能嵌入式系统
  • 2026国产时序数据库:格局演变下金仓融合多模架构的差异化突围
  • 面试 Java 基础八股文十问十答第十四期
  • 深度测评8个一键生成论文工具,MBA论文写作必备!
  • 【机翼】基于matlab三维机翼几何进行耦合静态气弹性分析【含Matlab源码 14991期】
  • 医疗数据用KNN插补稳缺失值
  • 深度测评8个AI论文平台,继续教育学生轻松搞定毕业论文!
  • 【案例】某零售品牌AI驱动的库存与品牌营销联动系统:架构师的设计思路
  • 【飞机】基于matlab倾转旋翼飞机齿轮箱建模与仿真(含非线性阻尼和立方摩擦效应)【含Matlab源码 14988期】
  • web手势剑阵(开源)
  • LangGraph详解:构建智能代理工作流的新范式
  • 【机翼】三维机翼几何进行耦合静态气弹性分析【含Matlab源码 14991期】
  • 【流体】基于matlab上风及一阶、二阶中心差分方案二维稳态对流扩散方程分析【含Matlab源码 14989期】含报告
  • vue学习笔记四
  • 【流体】上风及一阶、二阶中心差分方案二维稳态对流扩散方程分析【含Matlab源码 14989期】含报告
  • 【LeetCode热题100】Java详解:从前序与中序遍历序列构造二叉树(含递归/迭代双解法与工程实践)
  • YOLO26 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性
  • 【信号识别】TFMix:时频域融合赋能特定辐射源识别,领域泛化性能再突破【附python代码】
  • Python+django的校园二手书籍交易平台的设计实现
  • 【克拉美罗下界】突破CRB局限!多源波达方向估计的全局紧界ZZB方法重磅来袭【附python代码】
  • 【六杆】六杆快速回归机制运动学和动力学分析【含Matlab源码 14990期】
  • Python+django的校园共享厨房预约美食菜谱系统