MySQL 之 Buffer Pool

news2024/11/18 17:47:58

一、innoDB设计缓冲池目的

        避免频繁访问磁盘,提高数据库性能。(作用与引用Cache三级缓存类似。)

二、缓冲池工作模式

        读取数据:当Buffer Pool存在目标数据,就直接返回给客户端,没有再磁盘取数据。

        修改数据:修改Buffer Pool中数据的页,并将其设为脏页,最后后台线程将脏页写入磁盘。

三、缓冲池基本概念

申请时间及大小

        MySQL启动后向OS申请一片连续内存空间。默认128MB。

        磁盘和内存交互基本单位:页。页的大小:16KB。

结构

        主要为:全局内存(Global buffer)线程内存(Thread buffer) 两大部分。

全局内存:缓冲池里面有数据缓存页、索引缓存页、锁信息页、插入缓存页等等。                                                  此外还有重做日志缓存、额外的内存池。
线程内存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。

缓存页与控制块

innoDB为每个缓存页创建一个控制块,控制块信息包括「缓存页的表空间、页号、缓存页地址、链表节点」

碎片空间产生原因

Buffer Pool大小固定,每个缓存页对应一个控制块 大小固定。如果设置大小不是刚好的,就会产生多余的内存空间,也就是碎片空间。

从磁盘查询一条记录,是只缓冲一条记录吗?

磁盘与内存交互基本单位是页。而且索引也只能定位到记录属于磁盘中哪个页,

将页缓冲到Buffer Pool中后再通过页目录定位到具体的哪条记录。

Buffer Poll管理

空闲页管理

当从磁盘读取数据缓存到 Buffer Poll的空闲缓存页,需要快速找到哪些缓存页是空闲的!

方法:创建Free链表,将空闲页的控制块作为节点,加入到Free链表。

缓存页空闲,则将其控制块加入到Free链表;缓存页存储数据了,则将其控制块移除Free链表。

脏页管理

当后台线程要将脏页写入到磁盘,需要快速找到哪些缓存页 是脏页!

方法:创建Flush链表,将脏页的控制块作为节点,加入到Flush链表。

后台线程直接遍历 Flush 链表,将脏页写入到磁盘。

提高磁盘命中率方法

LRU(Least recently used)算法

(根据程序局部性原理生成)

  • 当访问的页在 Buffer Pool 里,就直接把该页对应的 LRU 链表节点移动到链表的头部。
  • 当访问的页不在 Buffer Pool 里,除了要把磁盘中的页放入到 LRU 链表的头部,还要淘汰 LRU 链表末尾的节点。

弊端:预读失效 ;Buffer Poll污染

预读机制

据程序空间局部性原理,在加载数据页时提前将其相邻数据页加载,目的减少磁盘IO;

预读失效:不会被访问的预读页却占用了 LRU 链表前排的位置,而末尾淘汰的页,可能是频繁访问的页,这样就大大降低了缓存命中率。

解决方法:LRU 划分了2 个区域:old 区域 和 young 区域预读的页就只需要加入到 old 区域的头部,当页被真正访问的时候,才将页插入 young 区域的头部。

young区域 存储热数据;old区域 存储冷数据;

Buffer Poll污染

Buffer Poll污染:当某个SQL语句扫描大量数据,将Buffer Poll里数据页全替换,淘汰大量热数据。再次访问时产生大量磁盘IO,使MySQL性能急剧下降。

解决方法:进入到 young 区域条件增加了一个停留在 old 区域的时间判断

同时满足「被访问」与「在 old 区域停留时间超过 1 秒」两个条件,才会被插入到 young 区域头部

脏页写入磁盘时机

        如果每次修改数据均刷入磁盘,性能会很低。因此在一定时机,批量刷盘。

MySQL宕机防止脏页丢失策略

        Write Ahead Log策略。也就是先写日志,再写入磁盘。通过redo Log日志,让MySQL有崩溃恢复能力。

触发脏页刷新时机

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

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

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

相关文章

1-高性能计算研究

高性能计算研究 E级计算机系统研制高性能计算应用软件研发并行编程框架应用协同开发优化平台和工具软件示例 高性能计算环境研发 E级计算机系统研制 高性能互联计算、编程、运行模型 应用驱动的新型可扩展基础算法(适用于E级计算的可计算物理建模与新型计算方法&a…

softmax回归

模型 softmax回归是多类分类模型,用于获取每个分类的置信度,置信度计算方式如下 经过全连接层,得到输出O,将O作为softmax的输入 O是输出向量,每个分量表示一个类别,y_hat_i表示i类别的置信度&#xff0…

[语义分割] DeepLab v1网络(语义分割、信号下采样、空间上的不敏感性、LargeFOV、膨胀卷积、空洞卷积、MSc、Multi-Scale)

Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs 论文地址:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs参考源码:https://github.com/TheLegendAli/DeepLab-Context DeepL…

数据库中的Hash索引以及哈希碰撞

hash索引,就是用过一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中 就比如下面的name字段,经过算法的分析,就会对应出一张hash表 如果我的两个name字段计算出来的key相同&a…

vscode eslint配置

1. 全局安装 eslint npm install -g eslint 2. control shift p 输入 settings 打开设置进行配置 3. 添加配置 {"workbench.colorTheme": "One Dark Pro","eslint.debug": true,"eslint.execArgv": null,"eslint.alwaysShow…

多表关联查询

十七、多表关联查询 但是开发中不会使用联合主键,还是只会使用一个主键 多表关联查询: 建表: 交叉连接 …… …… 重复时写清楚是哪个表的,不然会报错: 2、内连接 王妍没有部门,查不出来。此时需要用到外连…

Python 进阶(一):PyCharm 下载、安装和使用

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、下载 PyCharm二、安装 PyCharm三、创建项目四、界面汉化五、实用技巧5.1、使用快捷…

SpringMvc+Mybatis完整项目

0目录 1.SpringmybatisSpringmvc查询功能(记录数) 2.查询所有 3.增删改查(根据id) 4.增加用户注册登录功能 1.SpringmybatisSpringmvc增删改查 新建数据库 创建工程 配置web.xml 配置applicationContext.xml 实体类 My…

24考研数据结构-栈

目录 第三章 栈和队列3.1栈(stack)3.1.1栈的基本概念栈的基本概念知识回顾 3.1.2 栈的顺序存储上溢与下溢栈的顺序存储知识回顾 3.1.3栈的链式存储链栈的基本操作 第三章 栈和队列 3.1栈(stack) 3.1.1栈的基本概念 栈的定义 栈…

主流开源监控系统一览

减少故障有两个层面的意思,一个是做好常态预防,不让故障发生;另一个是如果故障发生,要能尽快止损,减少故障时长。而监控的典型作用,就是帮助我们发现及定位故障,这两个环节对于减少故障时长至关…

Docker挂载目录失败问题解决

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

SpringCloudAlibaba:服务网关之Gateway的cors跨域问题

目录 一:解决问题 二:什么是跨域 三:cors跨域是什么? 一:解决问题 遇到错误: 前端请求时报错 解决: 网关中添加配置文件,注意springboot版本,添加配置。 springboo…

Opencv Win10+Qt+Cmake 开发环境搭建

文章目录 一.Opencv安装二.Qt搭建opencv开发环境 一.Opencv安装 官网下载Opencv安装包 双击下载的软件进行解压 3. 系统环境变量添加 二.Qt搭建opencv开发环境 创建一个新的Qt项目(Non-Qt Project) 打开创建好的项目中的CMakeLists.txt,添加如下代码 # openc…

SpringBoot IOC与AOP(一)

IOC AOP 一、 分层解耦 内聚: 软件中各个功能模块内部的功能联系 耦合: 衡量软件中各个层/模块之间的依赖、关联的程度 软件设计原则:高内聚、低耦合 ​ 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到…

Java 悲观锁 乐观锁

锁可以从不同的角都分类。其中乐观锁和悲观锁是一种分类方式 一、悲观锁、乐观锁定义 悲观锁就是我们常说到的锁。对于悲观锁来说,他总是认为每次访问共享资源时会发生冲突,所以必须每次数据操作加上锁,以保证临界区的程序同一时间只能有一个…

文件上传漏洞 -- uploadlabs为例

文件上传漏洞原理 一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。 文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 ,再通过URL去访问以执行恶意代码。 非法用户可以利用上传的恶意脚…

如何使用 Flatpak 在 Linux 上安装 ONLYOFFICE 桌面编辑器?

Flatpak 是一款与 Linux 发行版无关的软件实用工具,可用于在 Linux 上构建和分发桌面端应用。其可帮助您安装第三方 Linux 应用程序,无需安装库或处理依赖。 ONLYOFFICE 桌面版是什么 ONLYOFFICE 编辑器桌面版是一款全面的办公工具,提供了文…

常用抓包命令

tcpdump的命令参数介绍 tcpdump选项可划分为四大类型: 1.控制抓包行为 2.控制信息如何显示 3.控制显示什么数据 4.过滤命令 一个电脑是可以有多个网卡的! 易错:ping命令式指定网口要-I ,-i表示ping的时间间隔、tcpdump指定网口-i 。 nsloo…

优惠券秒杀(二)

库存超卖问题分析 库存超卖问题其本质就是多个线程操作共享数据产生的线程安全问题,即当一个线程在执行操作共享数据的多条代码的过程中,其他线程也参与了进来,导致了线程安全问题的产生。例如:线程1发送请求,查询库存…

openGauss学习笔记-22 openGauss 简单数据管理-HAVING子句

文章目录 openGauss学习笔记-22 openGauss 简单数据管理-HAVING子句22.1 语法格式22.2 参数说明22.3 示例 openGauss学习笔记-22 openGauss 简单数据管理-HAVING子句 HAVING子句可以让我们筛选分组后的各组数据。 WHERE子句在所选列上设置条件,而HAVING子句则在由…