MySQL—缓存
目录标题
- 为什么要有Buffer Pool
- buffer pool有多大
- buffer pool缓存什么
- 如何管理Buffer Pool
- 如何管理空闲页
- 如何管理脏页
- 如何提高缓存命中率
- 预读失效
- buffer pool污染
- 脏页什么时候会被刷入到磁盘
为什么要有Buffer Pool
虽然说MySQL的数据是存储在磁盘中,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。所以InnoDB存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写能力。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jh1cSEOi-1691669854943)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230810195513568.png)]](https://img-blog.csdnimg.cn/3d547e29b76e44bc8f126c057da011ca.png)
有了缓冲池后:
- 当读取数据时,如果数据存在于 Buffer Pool 中,客户端就会直接读取 Buffer Pool 中的数据,否则再去磁盘中读取。
- 当修改数据时,首先是修改 Buffer Pool 中数据所在的页,然后将其页设置为脏页,最后由后台线程将脏页写入到磁盘。
buffer pool有多大
Buffer Pool 是在 MySQL 启动的时候,向操作系统申请的一片连续的内存空间,默认配置下 Buffer Pool 只有 128MB 。可以通过调整 innodb_buffer_pool_size 参数来设置 Buffer Pool 的大小,一般建议设置成可用物理内存的 60%~80%。
buffer pool缓存什么
InnoDB会把存储的数据划分为若干个页,以页作为磁盘和内存交互的基本单位,一个页默认大小为16KB,MySQL启动时,InnoDB会为buffer pool申请一篇连续的内存空间,然后按照默认的16KB的大小划分出一个个的页,buffer pool中的页就叫做缓存页。
Buffer Pool 除了缓存「索引页」和「数据页」,还包括了 undo 页,插入缓存、自适应哈希索引、锁信息等等。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kfPU1xv-1691669854944)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230810195810532.png)]](https://img-blog.csdnimg.cn/f5c91af2d7be4d78a060ef35ed24960f.png)
为了更好的管理这些在 Buffer Pool 中的缓存页,InnoDB 为每一个缓存页都创建了一个控制块,控制块信息包括「缓存页的表空间、页号、缓存页地址、链表节点」等等。
控制块也是占有内存空间的,它是放在 Buffer Pool 的最前面,接着才是缓存页,如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SJ0ZMqA3-1691669854945)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230810200153750.png)]](https://img-blog.csdnimg.cn/6ee1406e9d1c4b2f9c6d5d88ac412b6d.png)
上图中控制块和缓存页之间灰色部分称为碎片空间。
如何管理Buffer Pool
如何管理空闲页
为了能够快速找到空闲的缓存页,可以使用链表结构,将空闲缓存页的「控制块」作为链表的节点,这个链表称为 Free 链表(空闲链表)。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qfQgWFBG-1691669854945)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230810200339489.png)]](https://img-blog.csdnimg.cn/50b40507689545059c1155910899a4c1.png)
Free 链表上除了有控制块,还有一个头节点,该头节点包含链表的头节点地址,尾节点地址,以及当前链表中节点的数量等信息。
Free 链表节点是一个一个的控制块,而每个控制块包含着对应缓存页的地址,所以相当于 Free 链表节点都对应一个空闲的缓存页。
有了 Free 链表后,每当需要从磁盘中加载一个页到 Buffer Pool 中时,就从 Free链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上,然后把该缓存页对应的控制块从 Free 链表中移除。
如何管理脏页
buffer pool不仅提高读性能,还要提高写性能。在更新数据的时候,不需要每次都要写入磁盘,而是将buffer pool对应的缓存页标记为脏页,然后由后台线程将脏页写入到磁盘。
那为了能快速知道哪些缓存页是脏的,于是就设计出 Flush 链表,它跟 Free 链表类似的,链表的节点也是控制块,区别在于 Flush 链表的元素都是脏页。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7RbqxhN-1691669854946)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230810200719929.png)]](https://img-blog.csdnimg.cn/6174bfdbeeb24578b366a6550baccb14.png)
如何提高缓存命中率
使用LRU算法,该算法的思路是,链表头部的节点是最近使用的,而链表末尾的节点是最久没被使用的。那么,当空间不够了,就淘汰最久没被使用的节点,从而腾出空间。
简单的 LRU 算法并没有被 MySQL 使用,因为简单的 LRU 算法无法避免下面这两个问题:
- 预读失效;
- Buffer Pool 污染;
预读失效
先来说说 MySQL 的预读机制。程序是有空间局部性的,靠近当前被访问数据的数据,在未来很大概率会被访问到。所以,MySQL 在加载数据页时,会提前把它相邻的数据页一并加载进来,目的是为了减少磁盘 IO。但是可能这些被提前加载进来的数据页,并没有被访问,相当于这个预读是白做了,这个就是预读失效。
怎么解决预读失效而导致缓存命中率降低的问题?
最好就是让预读的页停留在 Buffer Pool 里的时间要尽可能的短,让真正被访问的页才移动到 LRU 链表的头部,从而保证真正被读取的热数据留在 Buffer Pool 里的时间尽可能长。MySQL 是这样做的,它改进了 LRU 算法,将 LRU 划分了 2 个区域:old 区域 和 young 区域。young 区域在 LRU 链表的前半部分,old 区域则是在后半部分,如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KHKrD20P-1691669854946)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230810201102871.png)]](https://img-blog.csdnimg.cn/b46a2098bb5e4eb4ae38a9c44d726417.png)
划分这两个区域后,预读的页就只需要加入到 old 区域的头部,当页被真正访问的时候,才将页插入 young 区域的头部。如果预读的页一直没有被访问,就会从 old 区域移除,这样就不会影响 young 区域中的热点数据。
buffer pool污染
当某一个 SQL 语句扫描了大量的数据时,在 Buffer Pool 空间比较有限的情况下,可能会将 Buffer Pool 里的所有页都替换出去,导致大量热数据被淘汰了,等这些热数据又被再次访问的时候,由于缓存未命中,就会产生大量的磁盘 IO,MySQL 性能就会急剧下降,这个过程被称为 Buffer Pool 污染。
怎么解决出现 Buffer Pool 污染而导致缓存命中率下降的问题?
MySQL 是这样做的,进入到 young 区域条件增加了一个停留在 old 区域的时间判断。具体是这样做的,在对某个处在 old 区域的缓存页进行第一次访问时,就在它对应的控制块中记录下来这个访问时间:
- 如果后续的访问时间与第一次访问的时间在某个时间间隔内,那么该缓存页就不会被从 old 区域移动到 young 区域的头部;
- 如果后续的访问时间与第一次访问的时间不在某个时间间隔内,那么该缓存页移动到 young 区域的头部;
这个间隔时间是由 innodb_old_blocks_time 控制的,默认是 1000 ms。也就说,只有同时满足「被访问」与「在 old 区域停留时间超过 1 秒」两个条件,才会被插入到 young 区域头部,这样就解决了 Buffer Pool 污染的问题 。另外,MySQL 针对 young 区域其实做了一个优化,为了防止 young 区域节点频繁移动到头部。young 区域前面 1/4 被访问不会移动到链表头部,只有后面的 3/4被访问了才会。
脏页什么时候会被刷入到磁盘
- 当 redo log 日志满了的情况下,会主动触发脏页刷新到磁盘;
- Buffer Pool 空间不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,需要先将脏页同步到磁盘;
- MySQL 认为空闲时,后台线程会定期将适量的脏页刷入到磁盘;
- MySQL 正常关闭之前,会把所有的脏页刷入到磁盘;
相关文章:
MySQL—缓存
目录标题 为什么要有Buffer Poolbuffer pool有多大buffer pool缓存什么 如何管理Buffer Pool如何管理空闲页如何管理脏页如何提高缓存命中率预读失效buffer pool污染 脏页什么时候会被刷入到磁盘 为什么要有Buffer Pool 虽然说MySQL的数据是存储在磁盘中,但是也不能…...
IP提取器对比器
需求: 一个html 页面 ,有两个输入框 第一个输入框输入文本中包含多个ip,输入的ip是不规则的,需要使用正则表达式提取出 输入文本的ip地址 , 然后在第二个输入框中输入内容,并提取出内容的ip ,如…...
【Spring Boot】构建RESTful服务 — RESTful简介
RESTful简介 本节将从基础的概念开始介绍什么是RESTful、RESTful的特点、RESTful中的资源、HTTP Method、HTTP Status,还将介绍RESTful和SOAP到底有哪些区别。 1.什么是RESTful RESTful是目前流行的互联网软件服务架构设计风格。REST(Representationa…...
模仿火星科技 基于cesium+水平面积测量+可编辑
当您进入Cesium的编辑水平积测量世界,下面是一个详细的操作过程,帮助您顺利使用这些功能: 1. 创建提示窗: 启动Cesium应用,地图场景将打开,欢迎您进入编辑模式。 在屏幕的一角,一个友好的提…...
26.配电网规划——考虑潮流约束的配电网规划
MATLAB代码直达:26.多时段-考虑潮流约束的配电网规划 clc;clear;close all; %% 导入数据 load(data.mat); MGpowerxlsread(MG1-3.xlsx); % 微电网的日负荷曲线 nt3 ; % 变压所个数 Sn25; % 变电所容量 MVA G…...
【云原生】K8S集群
目录 一、调度约束1.1 POT的创建过程1.1调度过程 二、指定节点调度2.1 通过标签选择节点 三、亲和性3.1requiredDuringSchedulingIgnoredDuringExecution:硬策略3.1 preferredDuringSchedulingIgnoredDuringExecution:软策略3.3Pod亲和性与反亲和性3.4使…...
python接口自动化之自动发送测试报告邮件
前言 SMTP(Simple Mail Transfer Protocol)也就是简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。python的smtplib模块就提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。 python发邮件主…...
umi出现“Cannot find module ‘umi-build-dev/lib/routes‘“ 错误
确认安装的 Umi 版本是否正确:首先,检查项目中 package.json 文件中的 umi 的版本号是否正确,确保版本号与项目所需的版本一致。清除缓存并重新安装依赖:可以尝试使用以下命令清除 npm 缓存并重新安装依赖: npm cache …...
Redis类型检查与命令多态
Redis中用于操作键的命令基本上可以分为两种类型。 其中一种命令可以对任何类型的键执行,比如说DEL命令、EXPIRE命令 、RENAME命令、TYPE命令、OBJECT命令等。 举个例子,以下代码就展示了使用DEL命令来删除三种不同类型的键: # 字符串键 redis> SE…...
mysql支持的xa具体指的是什么?
在MySQL中,XA指的是一种事务协议(eXtended Architecture),用于支持分布式事务。XA协议允许应用程序跨多个独立的数据库资源(例如多个MySQL实例)执行分布式事务。 具体来说,XA协议提供了以下关键…...
IntelliJ Idea 编译时控制台上中文输出乱码
猜测原因是IDEA启动时未指定编码信息,故与系统编码保持一致(windows中文系统默认为GBK编码),当以UTF-8编码进行编译在控制台会以GBK编码输出,从而导致乱码 解决方案 指定Idea启动时JVM的默认编码为UTF-8 Help -> Edit Custom Options P…...
锚框【目标检测】
生成多个锚框 假设输入图像高为h,宽为w,我们以图像每个像素为中心生成不同形状的锚框,缩放比 s∈(0,1],宽高比为r>0。那么锚框的宽度和高度分别为和。当中心位置给定时, 已知宽和高的锚框是确定的。缩放比为锚框高与图像高的比值,然后得到一个正方形锚框面积。 …...
001-Spring boot 启动内置Web容器分析
目录 代码入口上下文容器 加载web容器WebServercreateWebServergetWebServerFactory():getWebServer(): 执行WebServer#start自动配置读取配置修改配置 代码入口 上下文容器 SpringApplication.run(App.class); //追踪下去发现 context createApplicationContext…...
【Cocos Creator 项目实战 】消灭星星加强版(附带完整源码工程)
本文乃Siliphen原创,转载请注明出处 目录 概述 游戏整体流程 游戏框架设计 单一职责的类 主要流程控制类 核心玩法模块 UI: 游戏世界: 本文项目的代码组织结构 作者项目实践总结 场景只有一个入口脚本 尽量少在节点上挂载脚本 构…...
2023软件测试岗必问的100个面试题【含答案】
一、测试理论 1.什么是软件测试? 答:软件测试是通过执行预定的步骤和使用指定的数据,以确定软件系统在特定条件下是否满足预期的行为。 2.测试驱动开发(TDD)是什么? 答:测试驱动开发是一种开…...
MediaExtractor MediaCodec手动解码播放音乐
MediaExtractor MediaCodec手动解码播放音乐,笔记 private class DecodeAudio implements Runnable {Overridepublic void run() {//开始播放pcmaudioTrack.play();MediaExtractor extractor null;MediaCodec codec null;Log.i(TAG, "run: init");FileOutputStrea…...
element表格+表单+表单验证结合运用
目录 一、结果展示 二、实现代码 一、结果展示 1、图片 2、描述 table中放form表单,放输入框或下拉框或多选框等; 点击添加按钮,首先验证表单,如果存在没填的就验证提醒,都填了就向下添加一行表单表…...
亚马逊云科技发布Amazon HealthScribe,使用生成式AI技术实现临床文档的自动生成
近日,亚马逊云科技在纽约峰会上推出了Amazon HealthScribe,该服务符合HIPAA(《健康保险流通与责任法案》)的相关要求,可为医疗软件供应商提供一种基于语音和文字识别的生成式AI技术,帮助其创建能够自动生成…...
Windows11安装Linux子系统,并实现服务自启动,局域网访问,磁盘挂载
Windows11安装Linux子系统,并实现服务自启动,局域网访问,磁盘挂载 一、准备工作二、安装Linux子系统(wsl2)三、为Linux子系统设置桥接网络检查wsl版本在 Hyper-V 管理器中创建虚拟交换机创建 WSL 配置文件启动wsl 四、设置Windows开机自启动L…...
【Git】保姆级详解:Git配置SSH Key(密钥和公钥)到github
博主简介:22级计算机科学与技术本科生一枚🌸博主主页:是瑶瑶子啦每日一言🌼: “当人们做不到一些事情的时候,他们会对你说你也同样不能。”——《当幸福来敲门》 克里斯加德纳 Git配置SSH Key 一、什么是Git?二、什么…...
Lumafly:让空洞骑士模组管理变得像呼吸一样简单
Lumafly:让空洞骑士模组管理变得像呼吸一样简单 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 还在为空洞骑士模组安装的繁琐流程而烦恼吗…...
SEATA分布式事务——AT模式云
简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...
时频分析在隔振与运动控制中的联合应用
1. 时频分析在隔振与运动控制中的核心价值 在精密制造和科研实验中,隔振台和运动台的联合控制是个经典难题。传统方法就像用两种不同的语言描述同一个现象——隔振台习惯用频域的"振动频谱"说话,运动台则偏爱时域的"误差曲线"表达。…...
Swift高性能计算终极指南:Surge库快速入门教程
Swift高性能计算终极指南:Surge库快速入门教程 想要在Swift应用中实现高性能数学计算吗?Surge库是你的完美选择!Surge是一个基于Accelerate框架的Swift高性能计算库,专门为矩阵运算、数字信号处理和图像处理提供优化的数学函数。…...
swift-corelibs-libdispatch 测试与验证:如何确保并发代码的正确性与稳定性
swift-corelibs-libdispatch 测试与验证:如何确保并发代码的正确性与稳定性 【免费下载链接】swift-corelibs-libdispatch The libdispatch Project, (a.k.a. Grand Central Dispatch), for concurrency on multicore hardware 项目地址: https://gitcode.com/gh_…...
FLuke15B+与Fluke17B+的维修案例,适合硬件工 FLuke15B+与Fluke17B+的维修案例,适合硬件工程师。 包括15b、17b万用表原理图,电表开机无任何显示维修方法
FLuke15B与Fluke17B的维修案例,适合硬件工 FLuke15B与Fluke17B的维修案例,适合硬件工程师。 包括15b、17b万用表原理图,电表开机无任何显示维修方法,直流电压挡无法测量故障维修方法,交流档不能测量故障维修方法&#…...
顶半部与底半部:那次中断风暴让我彻底搞懂了
那天晚上,产线测试机突然卡死,屏幕上的数据刷新停滞在23:47:15。重启后查看内核日志,满屏的“IRQ handler took too long”警告。问题定位到我们新加的传感器驱动——中断频率从设计的100Hz变成了实际跑起来的2kHz,ISR里那个浮点运…...
别再死记硬背了!用湖科大计网视频+实战抓包,真正搞懂TCP/IP协议栈
从抓包实战到协议栈精通:TCP/IP学习者的可视化进阶指南 当计算机网络的抽象理论遇上真实的数据流动,学习曲线会变得陡峭还是平缓?答案取决于你是否找到了那把打开协议栈大门的钥匙——数据包捕获与分析。本文将带你突破传统死记硬背的学习方式…...
永磁同步电机(PMSM)速度电流双闭环FOC矢量精细控制策略
永磁同步电机(PMSM)速度电流双闭环FOC矢量控制深夜实验室的示波器上跳动着杂乱的波形,老张盯着屏幕猛嘬了口烟:"这破电机咋就跟喝高了似的?"三个月前接手这个永磁同步电机控制项目时,他绝对没想到…...
如何获得IEEE Xplore 兼容 PDF 文件?
某些期刊或会议(如DDCLS)提交终版论文PDF时,要求提供IEEE Xplore 兼容 PDF 文件,详细获取步骤如下。 1. 准备会议编号(Conference ID) 进入会议官网,一般在最终提交(Final submission)界面查看会议编号。如果实在找不到,直接给会…...
