MySQL——buffer poll

news2025/1/10 23:47:54

为什么要有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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省) 任务书

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省 任务书 模块一网络平台搭建与设备安全防护任务1:网络平台搭建 (50分)任务2:网络安全设备配置与防护(250分) 模块二网络安全事件响应、数字取证…

ERROR: KeeperErrorCode = NoNode for /hbase/master

原因分析 通过上面的情景模拟,我们可以看到报错的原因在于zookeeper中出现问题,可能是zookeeper中的/hbase/master被删除,或者是在hbase集群启动之后重新安装了zookeeper,导致zookeeper中的/hbase/master节点数据异常。 1. 停止…

ElasticSearch7.8学习笔记

1. ElasticSearch概述 1.1 ElasticSearch是什么 Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到…

CSS制作字体炫彩效果

目录 序言一、思路二、代码实现 序言 本节内容主要来讲解一下炫彩字体的实现,主要通过使用 background-clip以及background-position来实现,那么话不多说开始本节内容的学习吧! 一、思路 添加盒子以及内容使用 background-clip属性&#x…

如何防止短信盗刷和短信轰炸?

短信盗刷和短信轰炸是项目开发中必须要解决的问题之一,它的优先级不亚于 SQL 注入的问题,同时它也是面试中比较常见的一个经典面试题,今天我们就来看下,如何防止这个问题。 1.概念介绍 短信盗刷和短信轰炸的概念如下&#xff1a…

ios逆向某新闻 md5+aes

本期的案例比较简单,也许是ios逆向算法本来就比较简单的原因,所以前面我就多扯一些爬虫和逆向的东西。之前写的文章都是js逆向和android逆向的案例,这也是首篇ios的案例,所以会从入门开始讲起。 3大逆向对比 首先爬虫工程师大部…

SpringBoot【一】零基础入门 springboot 及 idea 搭建

一、前言 springboot是什么? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解&#xff0…

2024年超大跨径钢结构桥梁创新技术论坛暨钢桥联盟年度工作会议顺利召开

12月5日,由中交公路规划设计院有限公司、装配化钢结构桥梁产业技术创新战略联盟主办,保利长大工程有限公司、中交第二航务工程局有限公司、中交第二公路工程局有限公司、中交路桥建设有限公司、中交西安筑路机械有限公司、南京现代综合交通实验室、巨力锁…

win10上部署win11记事本

win10上部署win11记事本 原因 win10的老用户们, 不肯升级win11, 绝对是有留恋的东西吧,就想win7用户那样, 但是win11在日益更新, 特别是记事本, 增加了很多好用的功能, 比如多标签页, 但是不想升级win11, 还想用, 怎么办? 我在网上找到了解决方案, 接下来, 我们来操作一下吧…

记录:ubuntu24.04源码安装nginx

一. 下载Nginx源码 两个地址二选一即可 Nginx官网Nginx官网 Github eg:nginx-1.27.3.tar.gz 下载到 ubuntu24.04 的 Downloads ,解压 cd Downloads tar -zxvf nginx-1.27.3.tar.gz二. 编译安装 Note: 编译最好用 root 权限, 使用下面命令…

【前端】深入理解 JavaScript 中的数组与对象

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯数组与对象的基本概念数组(Array)数组示例 对象(Object)对象示例 💯数组与对象的对比核心区别如何选择&#…

31.下一个排列 python

下一个排列 题目题目描述示例 1:示例 2:示例 3:提示:题目链接 题解解题思路python实现代码解释:提交结果 题目 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3…

Codeforces Round 992 (Div. 2)

这场cf只在b卡了一下,因为b真是犯蠢了,我以为会向下取整,结果是完全就不取整,或者说是向上取整,卡了我半个小时,要不是紧急看了题一下,昨天那场就毁了 话不多说,直接开讲 A. Game …

vue入门实战(二)父子组件显示,参数传递

经过上次的写法&#xff0c;我们已经写出每个list项&#xff0c;现在要在每个父组件下面加入自己的子项 一、新建子组件&#xff1a; smallItem.vue&#xff1a; <script> export default{props:[text,id,status] //父组件传来的参数 } </script> <template>…

批量验证指定漏洞思路和流程

免责申明 本文仅是用于学习研究POC的地址收集与漏洞验证原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一图了解网络安…

Android 事件分发机制详解/ 及Activity启动流程浅谈

目前网上的事件分发机制文章很多&#xff0c;可能大家看了很多&#xff0c;还是很懵逼&#xff0c;这篇文章是我自己总结的事件分发机制&#xff0c;提取了在事件分发机制中&#xff0c;最精华的部分&#xff0c;如果对事件分发还是不太清楚&#xff0c;可以看看这篇文章 更多…

蓝桥杯刷题日记02-小球反弹

问题描述 有一长方形&#xff0c;长为 343720343720 单位长度&#xff0c;宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积)&#xff0c;其初速度如图所示且保持运动速率不变&#xff0c;分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰…

SkyWalking 和 ELK 链路追踪实战

一、背景 最近在给项目搭建日志平台的时候&#xff0c;采用的方案是 SkyWalking ELK 日志平台&#xff0c;但发现 ELK 日志平台中的日志没有 Trace ID&#xff0c;导致无法追踪代码报错的整体链路。 空哥提示&#xff1a;Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…

Ubuntu22.04深度学习环境安装【cuda+cudnn】

为了复现一篇深度学习论文&#xff0c;特意安装了Linux系统。前一天已经安装Linux显卡驱动&#xff0c;现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本&#xff1a; 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0&#xff0c;python没…

ue5 motion matching

ue5.5 gameanimationsample 先看动画蓝图 核心两个node 第一个是根据数据选择当前的pose 第二个是缓存一段历史记录&#xff0c;为第一个node选择的时候提供数据。 在animinstance的update方法中 每帧都更新这个函数&#xff0c;每帧更新trajectory的数据 看看第一个node的…