1分钟理解什么是MySQL的Buffer Pool和LRU 算法?

什么是缓冲池?

缓冲池是主内存中的一个区域,用于缓存被访问的表和索引数据。缓冲池允许频繁使用的数据直接从内存中访问,从而加快处理速度。在专用服务器上,通常会将高达 80% 的物理内存分配给缓冲池。

为了提高大容量读取操作的效率,缓冲池被划分为页。为了提高缓存管理的效率,缓冲池被实现为一个页面的链表;很少使用的数据会通过一种最近最少使用(LRU)算法的变体从缓存中淘汰。

LRU 算法

当需要为缓冲池添加新页面腾出空间时,会将最近最少使用的页面逐出,并将新页面插入到列表的中间位置。这种中间插入策略将列表视为两个子列表:

  • 在头部,有一个最近访问过的新的("年轻")页面的子列表
  • 在尾部,有一个访问时间较早的旧页面子列表 该算法将经常使用的页面保留在新子列表中。这 旧子列表包含使用频率较低的页面;这些页面是可能被淘汰的对象。

默认情况下:

  • 缓冲池的八分之三用于旧子列表。
  • 列表的中间点(tailHead)是新子列表尾部与旧子列表头部相接的分界线。
  • 上来把新加载进来的放在tailHead,也就是让你变成老的里面最新的,包括读和预加载的内容
  • 访问已经加载进buffer pool的页面会挪到新子列表第一位(用户实际查询,而非预加载)
  • 随着时间变长,未被访问的数据会像列表尾部移动,直至驱逐
相关推荐
kisshyshy几秒前
给端侧大模型装上“发动机”:React 合成事件 + 进度条组件全解
前端·react.js·node.js
hunterandroid11 分钟前
DataStore 工程化实践:迁移、并发更新与异常恢复
android·前端
晓说前端12 分钟前
TypeScript 核心语法进阶 —— 字面量类型与类型推论
前端·typescript
不简说38 分钟前
JS 代码技巧 vol.8 — 20 个函数式编程实战,把 if/else 拍扁的骚操作
前端·javascript·面试
头茬韭菜1 小时前
4.9 SSRF 防护 — Web 工具的出站安全与私有 IP 拦截
前端·tcp/ip·安全
Cobyte1 小时前
模板 DSL 解析器中的状态机设计
前端·javascript·vue.js
颜酱1 小时前
# 02 | 搭骨架:用 LangGraph 编排 12 步工作流(思路)
前端·人工智能·后端
颜酱1 小时前
02 | 搭骨架:用 LangGraph 编排 12 步工作流
前端·人工智能·后端
刘卓航众创芯云服务部2 小时前
Kimi K3复杂任务实测:我把团队最头疼的三个场景全跑了一遍
前端
cll_8692418912 小时前
一个好看的Wordpress博客文字css样式
前端·css·ui