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并设置密码,并配置容器自动重启的命令: docker run -d \--name redis \--restartalways \-p 6379:6379 \redis:latest \redis-server --requirepass "your_strong_password"详细解释: docker run -d&am…...
3D Gaussian Splatting代码详解(一):模型训练、数据加载
1.模型训练 训练流程:train.py中的training函数 这段代码实现了一个 3D 高斯模型的训练循环,旨在通过逐步优化模型参数,使其能够精确地渲染特定场景。以下是代码的详细解析: def training(dataset, opt, pipe, testing_iteratio…...
docker部署RustDesk自建服务器
客户端: Releases rustdesk/rustdesk GitHub 服务端: 项目官方地址:GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库: docker pu…...
工作实战总结与实现-mybatis-plus更新策略部分字段不更新问题
文章目录 案例场景存在问题解决方案一解决方案二继续延伸 案例场景 很简单的工作场景,需要将数据库某个表的字段设置为null或者空字符串,使用mybatis-plus的update语句,如下: order.setPassCode(null);reservationOrderManger.up…...
MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了,这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…...
Midjourney Describe API 的对接和使用
Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片,获取对图片的描述。使用该 API,只需要传递图片文件地址,API 会返回图片的详细描述。无需繁琐的参数设置,即可获得高质量的图片描述。 …...
《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编
1.整体框架:1-22题(17-20为编程题分别源自数中的P98,P162,P177页) 2.简答题部分: 3.计算题...
Qt入门9——绘图
基本概念 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力; Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。 绘图api核心类: 类说明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(源码级分析)
实例方法: interrupt()方法是设置结束阻塞(sleep、),并且设置中断标记true isInterrupted()判断当前是否中断 静态方法: Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好,既然上面的方法作用是清晰的&…...
计网408考点讲解
IPv4...
当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库
解决方法: ldd 命令来验证程序是否加载了正确的库: 如检查linear_elasticity可执行文件缺少的库,用下面命令: ldd linear_elasticity 可以发现下面not found就是缺少的库,还有对应的库的位置已经版本 $ 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,简称 T-BOX,也称远程信息处理控制单元(Telematics Control Unit, TCU),集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...
访问http网页强制跳转到了https的解决办法
目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因:HSTS(HTTP Strict Transport Security)什么是 HSTS?HSTS 的工作原理 如何解决?1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息:在 Firef…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
