MySQL内存(Buffer Pool)

embedded/2024/9/25 21:10:59/

Buffer Pool

MySQL 的数据存在磁盘,但是不能每次读取数据都从磁盘里去,这样磁盘IO太频繁,存在性能问题。
InnoDB设计了一个缓存池(Buffer Pool),缓冲池在内存中。
默认配置Buffer Pool大小为128MB,可以通过innodb_buffer_pool_size参数调整。一般调整为可用物理内存的60%~80%。

Buffer Pool缓存什么?

InnoDB会把存储的数据划分为若干,以页作为磁盘与内存的交互的基本单位,一个页默认大小为16KB,Buffer Pool中也是由构成。
Buffer Pool除了缓存索引页数据页,还包括undo页,插入缓存页、自适应哈希索引、锁信息等等。
在这里插入图片描述

Buffer Pool管理

InnoDB为每个缓存页都创建了一个控制块(类似于文件系统的PCB)

控制块信息包括:缓存页的表空间、页号、缓存页地址、链表节点等等

在这里插入图片描述

空闲页(Free 链表)

为了能够快速找到空闲的缓存页,可以使用链表结构,将空闲缓存页的控制块作为链表的节点,这个链表称为:Free 链表
在这里插入图片描述

脏页(Flush 链表)

与Free 链表类似
在这里插入图片描述

提高缓存命中率

使用简单的LRU算法会导致两个问题:

  • 预读失效
  • Buffer Pool污染

预读失效

  • MySQL有预读机制:
    MySQL在加载数据页时,会提前把它相邻的数据页一并加载进来,目的是较少磁盘IO。原理是程序具有空间局部性。
  • 预读失效:这些被提前加载进来的数据页,并没有被访问,相当于这个预读是白做了。这就是预读失效。
  • 解决:改进LRU算法,将LRU划分为2个区域:old 区 和 young区
    在这里插入图片描述
    预读的数据页放到old区,真正访问的也放到young区。如果预读也一直没被访问,就会从old区域移除。
    young被淘汰的页,会挤到old区的头部。

Buffer Pool 污染

当一个SQL语句扫描大量数据时,会把Buffer Pool的所有数据替换出去,导致大量热数据被淘汰了。
等这些热数据再次被访问时,就没有命中,再次进行磁盘IO,导致性能下降。

解决:
young区里是热数据,提高数据进入young的门槛,可以解决这个问题。
MySQL的解决方法:进入young区条件增加一个停留在old区域的时间判断。 具体如下:

  • 如果后续访问时间与第一次访问时间在某个时间间隔内,该缓存页就不会从old区进入young区。
  • 相反,该缓存页就会移动移动到young区头部。

这个间隔时间有innodb_old_blocks_time控制,默认为1s。

也就是说,只有同时满足[被访问]与 [在old区域停留时间超过1s] 这两个条件,才会被插入到young区头部

MySQL针对young区其实做了一个优化,为了防止young区域节点频繁移动到头部。young区前1/4被方位不会移动到链表头部,只有后3/4被访问才会。

脏页刷新时机

以下几种情况会触发脏页的刷新:

  • 当 redo log 日志满了,会主动触发脏页刷新到磁盘
  • Buffer Pool 空间不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,那么需要先将脏页同步到磁盘。
  • MySQL认为空闲时,后天线程会定期把适量的脏页刷入磁盘
  • MySQL正常关闭之前,会把所有脏页刷入到磁盘。

总结

在这里插入图片描述


http://www.ppmy.cn/embedded/116831.html

相关文章

Lanterns (dp 紫 线段树 二分 维护dp)

Lanterns - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 让所有点被覆盖,那么状态可以设计成覆盖一段前缀,并且中间不允许出现断点 由于CF崩了,所以暂时没提交代码。 记f(i) 为前 i 个灯笼点亮的最长前缀。 由于答案具有保留性&#xff…

【第2章 开始学习C++】进入C++

文章目录 导语C语言输入和输出main( )函数作为接口的函数头C预处理器和iostream文件头文件名名称空间使用 cout 进行 C 输出控制符 endl 导语 首先介绍一个显示消息的简单C程序。 源代码中包含一些供读者阅读的注释, 这些注释都以 // 打头, 编译器将忽…

51单片机-系列-数码管中断和定时器

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 数码管 8051单片机的最小系统 电源(5V)复位电路晶振(单片机的心脏)如果要使用PO口,必须加4.7K-10K上拉电阻&#xf…

linux命令行快捷键

第一章 linux之帮助命令 第二章 linux命令行快捷键 文章目录 linux命令行快捷键 linux命令行快捷键 Tab 命令补全或文件补全Ctrlu 删除或剪切光标之前的命令Ctrla 将光标移动到命令行开头Ctrle 将光标移动到命令行结尾ctrlc 终止当前命令ctrll 清屏ctrly 粘贴ctrlu的内容 参考…

众数信科 AI智能体政务服务解决方案——AI法律助手

政务服务解决方案 AI法律助手 一款基于AI大模型的智能鼠标 搭裁“寻知AI法律助手” 众数信科AI智能体 产品亮点 能够结合全国各地案例数据 为用户提供法律咨询、文书生成、案例研判 类案推荐、法规检索等法律服务 同时结合Al office插件 具备AI智能办公、PPT生成等功能 …

gnome Files管理文件学习

Files文件夹页可以非常高效的使用,接下来介绍一些有用的快捷命令和tricks 首先是快捷键: **Ctrl T**Ctrl N**Ctrl WClose window or tab**Ctrl FSearch**Ctrl LEnter location**BackspaceGo Back to a Previous FolderCtrl Zoom inCtrl -Zoom outCtrl 0…

echarts图表刷新

图表制作完成&#xff0c;点击刷新图标&#xff0c;可以刷新。 <div class"full"><div id"funnel" class"normal"></div><div class"refreshs"><div class"titles_pic"><img src"./…

QT 带箭头的控件QPolygon

由于对当前项目需要绘制一个箭头控件&#xff0c;所以使用了QPainter和QPolygon来进行绘制&#xff0c;原理就是计算填充&#xff0c;下面贴出代码和效果图 这里简单介绍下QPolygon QPolygon是继承自 QVector<QPoint>那么可以很简单的理解为&#xff0c;他就是一个点的…