MySQL 关键特性一:插入缓冲、双写缓冲

前言

​ 本文主要介绍 mysql 的几大特性之几,如:双写缓冲和插入缓存。

双写缓冲
基本概念

​ 双写缓冲(doublewrite buffer)是MySQL/InnoDB中用于支持原子页面更新的一种机制。在传统的数据库系统中,为了保证数据的一致性和可恢复性,通常需要进行冗余写入操作。这种冗余写入通过在原始数据写入后,再将这些数据写入一个额外的缓冲区来实现,从而确保即使在发生故障的情况下也能从备份数据中恢复。

核心就是通过备份数据页的方式保证数据的可靠性、一致性

​ 然而,这种冗余写入操作会对数据库性能产生负面影响,并且增加了存储设备的写入流量,尤其是在使用基于闪存的SSD作为存储介质时。随着非易失性内存(NVM)技术的发展,如PCM和STT-MRAM,它们提供了低延迟、高带宽、非易失性和高容量等特点,为改善数据库事务处理提供了新的可能性。

​ 在最新的研究中,提出了一种名为LSBM的日志结构化缓冲管理器,该管理器利用NVM技术来高效地原子更新页面。LSBM通过异地更新页面来实现原子性,并进行页面缓冲以提高性能。此外,LSBM还能够动态回收缓冲页面,以减少对存储的写入流量。通过在NVDIMM上实现LSBM并将其移植到MySQL/InnoDB中,实验结果表明LSBM不仅提高了数据库性能,还减少了在线事务处理(OLTP)工作负载上的写入流量。

​ 因此,对于使用MySQL/InnoDB的数据库系统来说,考虑采用基于NVM的LSBM可以有效地优化双写缓冲机制,既保持了数据的一致性和可恢复性,又显著提升了数据库的整体性能和存储效率。

结构
  1. 在内存结构中,Doublewrite Buffer由128个页(Page)构成,大小是2MB。这些页在内存中以Doublewrite Buffer的形式存在。

  2. 在磁盘结构中,Doublewrite Buffer在系统表空间上是128个页(2个区,extend1和extend2),大小也是2MB。这些页在磁盘上以Doublewrite File的形式存在。

工作流程
  1. 写操作触发: 当执行INSERT、UPDATE或DELETE等写操作时,MySQL首先将数据写入双写缓冲区。
  2. 同步到Doublewrite File: Doublewrite Buffer 的内存中的数据页会刷写到Doublewrite Buffer的磁盘上,分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB
  3. 实际数据写入: 一旦Doublewrite File中的数据被确认已经写入磁盘,MySQL就可以将这些数据写入实际的数据文件中
  4. 恢复机制: 如果在写操作过程中发生故障,MySQL可以从Doublewrite File中恢复数据。由于Doublewrite File中的数据是完整的,因此可以用来修复损坏的数据文件,确保数据的完整性和一致性。

在这里插入图片描述

为什么需要双写缓冲

​ 常见的服务器一般都是Linux操作系统,Linux文件系统页(OS Page)的大小默认是4KB。而MySQL的页(Page)大小默认是16KB。MySQL程序是跑在Linux操作系统上的,需要跟操作系统交互,所以MySQL中一页数据刷到磁盘,要写4个文件系统里的页。

​ 需要注意的是,这个操作并非原子操作,比如我操作系统写到第二个页的时候,Linux机器断电了,这时候就会出现问题了。造成”页数据损坏“。并且这种”页数据损坏“靠 redo日志是无法修复的。

重做日志中记录的是对页的物理操作,而不是页面的全量记录,而如果发生partial page write(部分页写入)问题时,出现问题的是未修改过的数据,此时重做日志(Redo Log)无能为力。写doublewrite buffer成功了,这个问题就不用担心了

插入缓冲
基本概念

​ MySQL的insert buffer是InnoDB存储引擎的一个重要特性,主要用于优化非聚集索引的插入和更新操作。以下是关于MySQL insert buffer的详细解释:

​ Insert buffer是一种特殊的数据结构(B+ tree),并不是缓存的一部分,而是物理页。当受影响的索引页不在buffer pool中时,MySQL会使用insert buffer来进行数据插入。

​ 对于非聚集索引的插入或更新操作,MySQL不会每次直接将数据插入到索引页中。相反,它会先将数据存储在一个临时的区域(即insert buffer)中,然后再逐步将这些数据合并到目标索引页中。

​ 从性能改进的角度来看,使用非集群次级索引可能会导致额外和随机的磁盘访问,从而降低存储设备的性能。MySQL的存储引擎通过插入缓冲来缓解这一问题,避免了额外的磁盘访问。这表明插入缓冲在减少磁盘I/O操作中起到了重要作用,有助于提高数据库的整体性能。

适用场景

​ MySQL在我们对非唯一的二级索引进行DML(删除行、写入行、修改行)时的优化

为什么是非唯一索引?

​ 当我们对唯一索引进行插入的时候需要查询数据是否唯一,如果数据在缓冲池中则直接读取缓冲池,如果数据不在缓冲池中则读取磁盘数据页,所以唯一索引会产生大量磁盘IO。

原理

对非唯一二级索引插入的流程如下:

  1. 数据在缓冲池中,直接修改缓冲池数据页
  2. 数据不在缓冲池中
    1. 写入到 insert buffer,异步刷新到磁盘

insert buffer 数据写回磁盘的时机:

  1. 辅助索引页被读取到缓冲池时
    1. 当辅助索引页被读取到缓冲池时,例如正在执行正常的 select 查询操作,这时需要检查 Insert Buffer Bitmap 页,然后确认该辅助索引页是否有记录存放于 Insert Buffer B+ 树中。若有,则将 Insert Buffer B+ 树中该页的记录插入到辅助索引页中
  2. insert buffer bitmap 页追踪到该辅助索引页已经没有可用空间
    1. Insert Buffer Bitmap是InnoDB存储引擎中用于追踪每个辅助索引页的可用空间,并确保至少有1/32页的空间以防止插入操作导致页面溢出。这个特殊的数据页类型可以标记多个辅助索引页的可用空间,以保证每次合并插入操作的成功
  3. Master Thread
    1. 在 Master Thread 中每秒或每10秒会进行一次 Merge Insert Buffer 操作

为什么 insert buffer 能提高性能

​ Insert Buffer B+ 树通过将对数据页的多次操作通过一次操作合并到原有的辅助索引中

insert buffer 提高了哪方面的性能

减少了磁盘随机读,因为当数据不在内存页的时候也不用去磁盘读取对应的数据页再更新数据页,而是直接存储在 Insert Buffer 中,再择机刷会磁盘

insert log 和 redo log 的区别
  1. 功能和目的
    • Insert Buffer:主要用于优化非聚集索引(辅助索引)的插入操作。当受影响的索引页不在Buffer Pool中时,会将其放入Insert Buffer中,以便后续合并操作。
    • Redo Log:用于保证事务的原子性和持久性,记录的是页的物理修改操作,用来恢复提交事务修改的页操作。
  2. 数据结构
    • Insert Buffer:是一种特殊的数据结构(B+ tree),并不是缓存的一部分,而是物理页。
    • Redo Log:由每个512字节大小的日志块组成,存储在内存中的redo log buffer中。
  3. 应用场景
    • Insert Buffer:主要针对非聚集索引的插入或更新操作,当插入的索引页不在Buffer Pool中时使用。
    • Redo Log:主要用于恢复提交后的物理数据页,确保数据的一致性和持久性
Reference
  1. https://cloud.tencent.com/developer/article/2398501
  2. https://www.cnblogs.com/booksea/p/17380938.html
  3. https://juejin.cn/post/6953442154249191454

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

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

相关文章

Android Dialog使用汇总

Dialog分类 AlertDialog Dialog 类是对话框的基类,官方建议我们不要直接实例化它,而是使用其子类来获取实例。AlertDialog是系统提供的一个直接子类,它能帮助我们快速构建出不同类型的弹窗。接下来就看下各种类型弹窗的使用。 1、普通对话框…

【区分vue2和vue3下的element UI Switch 开关组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中,el-switch(开关组件)提供了类似的属性和事件,但可能存在一些细微的差别或新增的功能。下面我将分别介绍 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中的 el-switch 组件…

wpf工程中加入Hardcodet.NotifyIcon.Wpf生成托盘

1、在项目中用nuget引入Hardcodet.NotifyIcon.Wpf。如下图所示。 2、在App.xaml中创建托盘界面&#xff0c;代码是写在 App.xaml 里面 注意在application中一定要加入这一行代码&#xff1a; xmlns:tb"http://www.hardcodet.net/taskbar" 然后在<Application.R…

系统架构设计师【第20章】: 系统架构设计师论文写作要点 (核心总结)

文章目录 20.1 写作注意事项20.1.1 做好准备工作20.1.2 论文写作格式 20.2 如何解答试题20.2.1 论文解答步骤20.2.2 论文解答实例 20.3 论文写作方法20.3.1 如何写好摘要20.3.2 如何写好正文1.写作技巧2.可能涉及的关键技术 20.3.3 摘要和正文的关系 20.4 常见问题及…

C#启动一个cmd.exe多次随时输入命令并获取输出

想要实现的效果,程序通过Process类一次启动cmd,后台线程每隔一定时间,向其输入命令,获得并处理输出。 一、基本操作 首先,通常操作的例子一抓一大把: 1、通过Process启动cmd执行一条/多条(&&连接)命令; 2、退出(一条时可以在命令开头加“/c”自动退出,或…

html 使用svg矢量图时无法 调整宽高问题解决,不能像图片一样设置宽高比例问题

引入的路径后加 #svgView(preserveAspectRatio(none)) 具体代码如下 修改前 <img src"/assets/svgs/full_screen_full.svg" class"im"> 修改后 <img src"/assets/svgs/full_screen_full.svg#svgView(preserveAspectRatio(none))" cla…

免费注册US.KG域名支持接入CF

注册地址&#xff1a; https://register.us.kg/auth/register 号码和地址我是随便填的&#xff0c;不知道对以后有没有影响 收到激活邮件&#xff0c;可能在垃圾箱里 接下来是有个KYC验证&#xff0c;需要填写信息和上传KYC照片&#xff0c;我也是乱填的和乱上传的。可以去找…

ERPNext - 用Python打造您的企业资源规划解决方案

文章目录 ERPNext - 用Python打造您的企业资源规划解决方案第一部分&#xff1a;背景第二部分&#xff1a;ERPNext是什么&#xff1f;第三部分&#xff1a;如何安装ERPNext&#xff1f;第四部分&#xff1a;ERPNext基本使用方法第五部分&#xff1a;场景应用示例第六部分&#…

Excel 文件损坏了打不开怎么办?几种 Excel 文件修复方法帮助你

当你想要打开电脑 Excel 文件的时候发现系统提示文件被损坏或者其他一些原因导致无法打开&#xff0c;这时候应该怎么办呢&#xff1f;别急下面为大家总结了 Excel 文件修复的一些方法。 更改信任中心 Excel 软件具有内置的安全功能会限制有潜在风险的文件&#xff0c;当 Exc…

挑战你的数据结构技能:复习题来袭【6】

1. (单选题)设无向图的顶点个数为n,则该图最多有&#xff08;&#xff09;条边 A. n-1 B. n(n-1)/2 C. n(n1)/2 D. 0 答案&#xff1a;B 分析&#xff1a; 2. (单选题)含有n个顶点的连通无向图,其边的个数至少为()。 A. n-1 B. n C. n1 D. nlog2n 答案&#xff1a;A…

yolov10代码阅读

一 数据处理 在v8之后&#xff0c;v9和v10都是参考v8的数据增强处理&#xff0c;主要有以下&#xff0c;具体其中一些增强并未用到&#xff0c;可以参考具体配置 二 模型结构 以yolov10x为例子&#xff0c;整个模型结构如下 a. 对于SCDown&#xff0c;是 Spatial-channel d…

AI编程新手快速体验SpringCloud Alibaba 集成AI功能

上周六写了一篇文章 震撼发布&#xff01;Spring AI 框架重磅上线&#xff0c;Java 集成 AI 轻松搞定&#xff01; 部分同学可能没有科学上网的条件&#xff0c;本地ollama 集成又比较笨重。趁着周六&#xff0c;写一篇基于SpringCloud Alibaba 集成AI的文章。 先简单介绍…

房地产销售管理系统中的风险管理与预警机制有什么作用?

​房地产销售管理系统中的风险管理与预警机制是确保企业稳健运营、降低潜在风险的关键组成部分。这一机制旨在通过系统化的手段&#xff0c;对房地产销售过程中可能出现的各种风险进行识别、评估、预警和监控&#xff0c;从而为企业决策提供有力的支持。 一、风险管理 风险识别…

Vue3实战笔记(60)—从零开始:一步步搭建Vue 3自定义插件

文章目录 前言一、自定义插件二、使用步骤总结 前言 在开发和学习中&#xff0c;经常使用一些好用的插件&#xff0c;那么如何创建一个自己的插件呢&#xff1f;在 Vue 3 中&#xff0c;你可以通过创建一个包含 install 方法的对象来定义自定义插件。install 方法接收两个参数…

鱼哥赠书活动第25期:618火热来袭,网络安全书单推荐

鱼哥赠书活动第25期&#xff1a;&#x1f31f;618火热来袭&#xff0c;网络安全书单推荐&#x1f680; &#x1f3f0; 1. 《内网渗透实战攻略》&#xff1a;&#x1f6e1;️2. 《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》&#xff1a;&#x1f396;️ 3. 《C…

openGauss系数据库逻辑复制实现双写

本篇关于逻辑复制实现双写的案例&#xff0c;本来准备了3个环境&#xff0c;分别是306、501和505&#xff0c;奈何在5版本向3版本订阅的时候&#xff0c;出现了报错&#xff0c;但也将整个过程都记录下来吧。 环境准备 节点信息 MogDB# select version(); …

nc解决自定义参照字段前台保存后只显示主键的问题

nc解决自定义参照字段前台保存后只显示主键的问题 自定义参照类VoucherRefModel.java package nc.ui.jych.ref;import nc.ui.bd.ref.AbstractRefModel;/*** desc 凭证号参照* author hanh**/ public class VoucherRefModel extends AbstractRefModel {Overridepublic String[…

Python 高手编程系列二:Python 3 和 Python 2 的主要差异

前面已经说过&#xff0c;Python 3 打破了对 Python 2 的向后兼容。但它并不是完全重新设计的。 而且&#xff0c;也并不是说 2.x 版本的 Python 模块在 Python 3 下都无法运行。代码可以完全跨版本兼 容&#xff0c;无需其他工具或技术在两大版本上都可以运行&#xff0c;但一…

BCA蛋白定量法简介-卡梅德生物

BCA&#xff08;Bicinchoninic Acid&#xff09;蛋白定量法是一种广泛使用的生化分析技术&#xff0c;用于测定样品中的总蛋白质含量。它基于两种化学物质的反应&#xff1a;铜离子&#xff08;Cu^2&#xff09;和双邻二氮杂菲&#xff08;Bicinchoninic Acid&#xff0c;BCA&a…

AUTOSAR ECUM模块介绍

AUTOSAR ECUM 模块概述 在现代汽车电子系统中,AUTOSAR(Automotive Open System Architecture)扮演着至关重要的角色。而其中的 EcuM(ECU Management)模块更是具有核心地位。 EcuM 模块主要负责 ECU(Electronic Control Unit)的管理和控制。它的定义可以概括为:一个集成…