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

什么是缓冲池?

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

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

LRU 算法

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

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

默认情况下:

  • 缓冲池的八分之三用于旧子列表。
  • 列表的中间点(tailHead)是新子列表尾部与旧子列表头部相接的分界线。
  • 上来把新加载进来的放在tailHead,也就是让你变成老的里面最新的,包括读和预加载的内容
  • 访问已经加载进buffer pool的页面会挪到新子列表第一位(用户实际查询,而非预加载)
  • 随着时间变长,未被访问的数据会像列表尾部移动,直至驱逐
相关推荐
掘金安东尼2 小时前
纯 CSS 实现弹性文字效果
前端·css
牛奶2 小时前
Vue 基础理论 & API 使用
前端·vue.js·面试
牛奶3 小时前
Vue 底层原理 & 新特性
前端·vue.js·面试
anOnion3 小时前
构建无障碍组件之Radio group pattern
前端·html·交互设计
pe7er3 小时前
状态提升:前端开发中的状态管理的设计思想
前端·vue.js·react.js
SoaringHeart4 小时前
Flutter调试组件:打印任意组件尺寸位置信息 NRenderBox
前端·flutter
晚风予星5 小时前
Ant Design Token Lens 迎来了全面升级!支持在 .tsx 或 .ts 文件中直接使用 Design Token
前端·react.js·visual studio code
sunny_5 小时前
⚡️ vite-plugin-oxc:从 Babel 到 Oxc,我为 Vite 写了一个高性能编译插件
前端·webpack·架构
GIS之路5 小时前
ArcPy 开发环境搭建
前端
林小帅6 小时前
【笔记】OpenClaw 架构浅析
前端·agent