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

MySQL——buffer poll

为什么要有buffer poll?

如果没有buffer poll,每次读取数据的时候都是从磁盘上读的,这样效率是很差的的。 所以有了提高效率的方式,就加上了一个缓存——buffer poll

所以,当我们读取数据的时候就有以下的方式

  • 当读取数据的时候,如果buffer poll中有,就直接返回给用户
  • 如果buffer poll中没有,就需要将数据所在的页设置为脏页,然后由后台的线程将脏页读取到磁盘上

buffer poll有多大

在MySQL启动的时候,会向操作系统申请一片内存为buffer poll,默认是128MB。
当然,这个配置是可以通过innodb_buffer_poll_size参数设置

buffer poll中的页

InnoDB会把存储的数据划分为一个个页,每个页的大小都是16KB,而buffer poll中的页就叫做缓存页

什么是脏页、空闲页、干净页

  • 空闲页:buffer poll中没有用到的页
  • 干净页:buffer poll中的页数据和磁盘上的一样
  • 脏页:buffer poll中的页数据和磁盘上的不一样

如何管理空闲页、干净页、脏页?

  • Free List:只管理空闲页
  • LRU List:管理干净页和脏页
  • Flush List:只管理脏页

在这里插入图片描述

  • Free List:管理空闲的页,当执行查询操作的时候,如果对应的也在buffer poll中就直接返回,如果不在buffer poll中,但Free List不为空,则从磁盘查询对应的数据并且保存到Free List的某个页中,然后将这个页从Free List中移除并放入到LRU List中。
  • LRU List:管理所有从磁盘读取的页,包含了未被修改和已经修改的页,并根据LRU算法进行维护和淘汰。
  • Flush List:当LRU List中的页被修改后会被标识为脏页,并把脏⻚加⼊到Flush List 中,在这种情况下,数据库会通过刷盘机制把 Flush List中的脏⻚刷回磁盘

Flush List是一个专门用来管理脏页的列表, 而LRU List是用来管理buffer poll中页的可用性。Flush List ⽤来管理要被刷回磁盘的⻚,⼆者互不影响。 Flush List 中的脏⻚在执⾏了刷盘操作后会将空间还给Free List

内存这么多数据页,如何快速找到目标页呢?

  • 第一种方式就是遍历链表,这显然不可取,时间复杂度达到了O(N)
  • 第二种方式就是InnoDB采取的方式,用page Hash的方式,也就是每当磁盘将数据页加载到内存的时候,用数据的页空间ID和页号作为KEY,当前页的地址作为VALUE保存起来每次查询时通过key来找到对应的value,从而快速找到对应的目标页。 时间复杂度是O(1)

脏页什么时候被刷盘呢?

首先我们要知道当修改数据的时候,先修改的是buffer poll所在的页,并标记为脏页,但是此时磁盘还是原来的数据。所以在刷盘前会采用WAL技术,即先写入日志,再写入磁盘。

这样的方式即使MySQL宕机了,也可以通过redo log重新恢复数据。
以下是刷盘时机:

  • 当redo log满了后,会将脏页刷入到磁盘中
  • buffer poll空间不足时,会淘汰数据页,如果是脏页就会进行刷盘
  • 由后台进程在空闲的时候自动进行刷盘

buffer poll是通过什么方式淘汰数据的?

buffer poll的大小是有限的,难免就有可能buffer poll满了,需要淘汰掉一部分数据。而我们当然希望频繁访问的数据在buffer poll,淘汰掉哪些不经常访问的数据,这就保证了buffer poll可以继续缓存新的数据了。

所以,有了LRU算法。
算法思想:链表头部的数据是最新被访问的,而链表后面的数据是最久未被访问的。那么当空间不足的时候,就要淘汰掉哪些最久未被使用的数据了。

所以当我们访问数据的时候,有两种结果:

  • 如果访问的数据在链表上,就将它放到LRU链表的头部
  • 如果没有在链表上,就需要将页放到链表的头部,并且淘汰掉LRU链表最后的节点。

比如下图,假设LRU链表长度为5,LRU链表从左到右有 1 2 3 4 5的页

在这里插入图片描述
如果访问了3号的页,就需要将3号放到LRU链表的头部
在这里插入图片描述
如果访问的8号的页,因为8号页不在buffer poll中,所以需要将8号页放到LRU链表的头部,并且淘汰掉5号页
在这里插入图片描述
但是MySQL没有采用这种方式,因为这种方式会带来两个问题

  • 预读失效
  • buffer poll污染

什么是预读失效?

预读失效:要知道CPU在加载数据的时候,是一块一块存储的,因为相邻的数据可能会在短时间访问到,所以MySQL在加载数据的时候,会将它相邻的数据加载进来,目的就是为了减少磁盘IO。

但是,这些被加载进来的数据是有可能没有被访问的,这就导致了预读失效。

如何解决预读失效问题?

所以为了解决上面的问题,MySQL将LRU算法改进,将LRU链表划分为了2个区域,一个是young区,一个是old区,例如下图
在这里插入图片描述
划分了2个区域后,预读的数据页就会放到old区域,不会放到young区域,只有真正的被访问的使用,会插入到young区域的头部,如果预读的页一直没有被访问就会从old区域中移除。

这样就解决了预读失效的问题,但是还有一个就是buffer poll污染问题没有被解决。

什么是buffer poll污染?

当某个SQL语句需要扫描大量的数据,并且buffer poll内存有限的情况下,可能会将buffer poll里的所有数据全部替换出去,导致大量的热点数据失效了。 当再次被访问的时候,就会造成大量的磁盘IO,性能下降,这就是buffer poll污染。

如何解决buffer poll污染的问题?

MySQL为了解决buffer poll污染的问题,将old区域添加了一个时间判断
如果访问的时间在第一次访问的时间间隔内,那么不会将这个数据页从old区域放到young区域,如果不在第一次访问的时间间隔内,就会将该数据页从old渔区放到young区域。 这样就解决了buffer poll污染的问题。

参考资料:

  • https://xiaolincoding.com/mysql/buffer_pool/buffer_pool.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E6%9C%89-buffer-pool
  • https://blog.csdn.net/error044/article/details/131036148?ops_request_misc=%257B%2522request%255Fid%2522%253A%25223ee1266dddf32eb5972cab120fac8f71%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=3ee1266dddf32eb5972cab120fac8f71&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduend~default-2-131036148-null-null.nonecase&utm_term=buffer%20poll&spm=1018.2226.3001.4450

相关文章:

MySQL——buffer poll

为什么要有buffer poll? 如果没有buffer poll,每次读取数据的时候都是从磁盘上读的,这样效率是很差的的。 所以有了提高效率的方式,就加上了一个缓存——buffer poll 所以,当我们读取数据的时候就有以下的方式 当读…...

使用GO--Swagger生成文档

概述 在前后端分离的项目中,后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包,用于处理Swagger 2.0(即OpenAPI 2.0)规范。它提供了丰富的工具集&#x…...

Pac4j 学习笔记

随着互联网技术的飞速发展,网络安全问题日益凸显,企业信息安全与身份认证系统变得越来越重要,而且安全认证集成方案作为保障网络安全的重要一环,其研究与应用也至关重要。在这种背景下,Pac4j 作为一种流行的身份验证库…...

什么?RayLink远程控制软件支持企业IT应用!

在当今企业IT管理中,远程控制工具扮演着不可或缺的角色。设想一下,你的团队成员分散在全球各地,或者员工正在远程工作,这时电脑突然出现问题。如果IT支持团队能够利用远程控制软件,比如RayLink,迅速远程接入…...

LeetCode Hot100 51~60

图论51. 岛屿问题52. 腐烂的橘子53. 课程表54. 前缀树55. 全排列56. 子集57. 电话号码58. 组合总和59. 括号生成60. 单词搜索 图论 51. 岛屿问题 经典洪水问题算法 class Solution { public:int numIslands(vector<vector<char>>& grid) {int nr grid.size…...

docker 启动 redis 同时设置密码,关机后会自动重启

以下是使用Docker启动Redis并设置密码&#xff0c;并配置容器自动重启的命令&#xff1a; docker run -d \--name redis \--restartalways \-p 6379:6379 \redis:latest \redis-server --requirepass "your_strong_password"详细解释&#xff1a; docker run -d&am…...

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1.模型训练 训练流程&#xff1a;train.py中的training函数 这段代码实现了一个 3D 高斯模型的训练循环&#xff0c;旨在通过逐步优化模型参数&#xff0c;使其能够精确地渲染特定场景。以下是代码的详细解析&#xff1a; def training(dataset, opt, pipe, testing_iteratio…...

docker部署RustDesk自建服务器

客户端&#xff1a; Releases rustdesk/rustdesk GitHub 服务端&#xff1a; 项目官方地址&#xff1a;GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库&#xff1a; docker pu…...

工作实战总结与实现-mybatis-plus更新策略部分字段不更新问题

文章目录 案例场景存在问题解决方案一解决方案二继续延伸 案例场景 很简单的工作场景&#xff0c;需要将数据库某个表的字段设置为null或者空字符串&#xff0c;使用mybatis-plus的update语句&#xff0c;如下&#xff1a; order.setPassCode(null);reservationOrderManger.up…...

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…...

Midjourney Describe API 的对接和使用

Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片&#xff0c;获取对图片的描述。使用该 API&#xff0c;只需要传递图片文件地址&#xff0c;API 会返回图片的详细描述。无需繁琐的参数设置&#xff0c;即可获得高质量的图片描述。 …...

《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编

1.整体框架&#xff1a;1-22题&#xff08;17-20为编程题分别源自数中的P98,P162,P177页&#xff09; 2.简答题部分&#xff1a; 3.计算题...

Qt入门9——绘图

基本概念 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力&#xff1b; Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。 绘图api核心类&#xff1a; 类说明QPaint…...

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…...

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法&#xff1a; interrupt()方法是设置结束阻塞(sleep、)&#xff0c;并且设置中断标记true isInterrupted()判断当前是否中断 静态方法&#xff1a; Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好&#xff0c;既然上面的方法作用是清晰的&…...

计网408考点讲解

IPv4...

当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库

解决方法&#xff1a; ldd 命令来验证程序是否加载了正确的库&#xff1a; 如检查linear_elasticity可执行文件缺少的库&#xff0c;用下面命令&#xff1a; ldd linear_elasticity 可以发现下面not found就是缺少的库&#xff0c;还有对应的库的位置已经版本 $ ldd lin…...

文件下载的几种方式

1、使用window.open方法 url: 可以为文件存放的地址 function downloadFile(url) {window.open(url); }2、使用<a>标签进行文件下载 <a href"/多因素登录说明文档.pdf" class"link-text">说明文档</a> 3、使用fetch和Blob对象 这种…...

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...

访问http网页强制跳转到了https的解决办法

目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因&#xff1a;HSTS&#xff08;HTTP Strict Transport Security&#xff09;什么是 HSTS&#xff1f;HSTS 的工作原理 如何解决&#xff1f;1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息&#xff1a;在 Firef…...

3D 生成重建016-SA3D从nerf中分割一切

3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标&#xff1a; SAM 是一种强大的二维视觉基础模型&#xff0c;能够在 2D 图像中进行任意物体的分割。传统上&#xff0c;SAM 在二维空间表现出色&#xff0c;但其无…...

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…...

qt基本部分控件用法(一)

前言: 以前 windows下做工具主要是MFC&#xff0c;趁有点空时间&#xff0c;研究了QT&#xff0c;感觉跟MFC 差不多&#xff0c;VS 比 QT CREATOR 还是强大&#xff0c;不过QT可以跨平台&#xff0c;功能更强大&#xff0c;MFC 只能在win平台下.&#xff1b; 1&#xff1a;环境…...

【Linux】环境ChatGLM-4-9B 模型之 openai API 服务

一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…...

Too many open files 问题处理

某个简单的 python 服务&#xff0c;运行一段时间就崩溃。查看日志后发现有一个系统错误 OSError: Errno24 Too many open files要理解这个问题&#xff0c;首先要理解什么是文件描述符&#xff0c;可以参考我的另一篇文章(Linux 系统文件描述符&#xff08;File Descriptor&a…...

CentOS 7 环境下常见的操作和配置

目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd&#xff08;/etc/vsftpd/vsftpd.conf&#xff09; 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…...

HTTP(超文本传输协议)

HTTP是万维网通信的基础构成&#xff0c;是一个简单的请求相应协议&#xff0c;基于TCP之上80号端口 通信原理 DNS解析 将域名甩个DNS服务器解析&#xff0c;将域名化为IP访问 建立TCP连接 如图&#xff0c;客户端先发送一个sys置位seq为x&#xff08;任意值&#xff09;的…...

etcd-v3.5release-(3)-readIndexRead

笔记1&#xff1a;读操作包括两种&#xff0c;readIndex和serilizable&#xff0c;readIndex指一致性读&#xff0c;一旦a读到了数据x&#xff0c;那么a及a以后的数据都能读到x&#xff0c;readIndex读会先确认本leader是不是有效地leader&#xff0c;如果有效则记录此刻的comm…...

IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置

NA消息用单播还是多播的判断理由 单播回复&#xff08;Unicast&#xff09;&#xff1a; 如果客户端发送 RS 消息时&#xff0c;使用的是一个全局地址或链路本地地址作为源地址&#xff0c;则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量&#xff0c;…...

C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数

知识要点&#xff1a;数组作函数参数 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序&#xff0c;前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...