MySQL的组成与三种log

MySQL由几块组成

  1. 连接器
  2. 分析器
  3. 优化器
  4. 执行器

在这里插入图片描述

MySQL的三大log

blog

作用:

用于主从同步与数据恢复

记录内容:

已经完成的 DML(数据操作语句),主要是用于数据备份

redolog<重试日志>

作用:
  1. 崩溃恢复,用于事务的持久化,确保数据一致性
  2. 减少写磁盘IO慢的问题
记录内容:

记录数据页的物理变化(可以理解为记录的是DML造成的数据diff)

工作机制

在这里插入图片描述

MySQL写操作同步写的是缓存区与redolog,异步写的磁盘

思考:写redolog也是磁盘操作为啥比直接写数据快?
redolog是连续内存,顺序写入,不需要IO寻址,所以更快

工作机制

  1. 写入顺序:redolog 是顺序写入的,这是非常高效的。
  2. 两段式提交:在事务提交时,MySQL 首先将修改记录到 redolog,然后再修改数据页。这样,在系统崩溃时,系统可以通过 redolog 恢复事务的修改。
  3. 双写缓冲:为了防止单点故障导致的数据丢失,InnoDB 使用双写缓冲机制将数据同时写入 redolog 和缓冲池。

undolog

作用:
  1. 事务的回滚
  2. 多版本控制<MVCC由undolog实现>
记录内容:

旧值,用于事务的回滚

MVCC

多版本并发控制
可以看下面这个文章:
MVCC详解

MVCC与undolog如何实现版本链

mysql列中会存有俩隐藏字段:

  • trx_id: 最近操作的事务id(自增)<事务可能未提交>
  • roll_pointer: 最新undolog日志
    在这里插入图片描述
    单条数据的undolog内容:(链表结构)
  • data:mysql数据快照
  • roll_pointer:这条数据上个的undolog地址

insert 语句产生的undolog roll_pointer内容为空,因为他没有上个版本

在这里插入图片描述
所以可以通过mysql数据+undolog 找到数据的历史版本

MVCC如何解决幻读问题

参考资料

简单概括如下:
开启事务的时候会产生一个视图,存本次事务id,所有活跃的事务id等
数据的事务id<最小的活跃事务id 证明已提交,可读
数据的事务id>本次事务id 证明未提交,不可读
数据的事务id属于活跃的事务id 证明当时未提交,不可读

这样就通过比较事务id的方式解决幻读了

MVCC如何实现读已提交与可重复读

读已提交实现原理
  1. 一致性读:

    • 每次 SELECT 查询都会获取最新提交的快照。
    • 事务读取时,会忽略未提交的事务所做的修改,读取其他事务已提交的最新版本。
      事务ID比较:
  2. 读取时,检查数据行的创建版本号和删除版本号。

    • 只读取创建版本号小于等于当前事务ID的数据,并且删除版本号大于当前事务ID的数据或删除版本号为空的数据。
可重复读实现原理

固定的快照视图
事务开始时,获取一个一致性快照,整个事务期间读取的数据视图保持不变

  1. 一致性读:
  • 事务开始时,获取一个一致性快照
  • 在事务期间,所有 SELECT 查询基于该一致性快照。
  1. 事务ID比较:

    • 读取时,检查数据行的创建版本号和删除版本号。
    • 只读取创建版本号小于等于当前事务开始时的快照数据,并且删除版本号大于当前事务开始时的快照数据或删除版本号为空的数据。

区别:

  1. 可重复读在事务开始时,会生成一个一致性快照存当时活跃的事务id
  2. 读已提交比较的是数据上的事务id,可重复读比较多是快照数据上的事务id

扩展

interpolateparams 参数做了什么

https://wklken.me/posts/2021/01/22/golang-sql-driver-interpolateparams.html
interpolateparams=false
prepared -> execute -> close
好处:

  1. 避免通过引号组装拼接sql语句。避免sql注入带来的安全风险
  2. 可以多次执行的sql语句

interpolateparams=true

execute -> close

  1. 减少了prepared网络请求
  2. 会防止SQL注入, 在驱动中通过转义特殊字符实现的

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

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

相关文章

【CSS】aspect-ratio属性详解

目录 基本语法示例讲解保持图片的宽高比使用 aspect-ratio 创建响应式嵌入视频正方形元素 与其他属性的结合 aspect-ratio 属性是 CSS 中的一个有用属性&#xff0c;它允许你轻松地设置元素的宽高比。这个属性可以确保元素在不同屏幕尺寸和容器大小下保持一定的宽高比&#xff…

跟着AI学AI_02, 时域频域和MFCC

AI&#xff1a;ChatGPT4o 时域和频域是信号处理中的两个基本概念&#xff0c;用于描述信号的不同特性。 时域 时域&#xff08;Time Domain&#xff09; 是对信号随时间变化的描述。在时域中&#xff0c;信号是作为时间的函数来表示的。 时域表示&#xff1a;例如&#xff0…

什么情况下需要用到动态IP

有许多方法和工具来实现包括主机名、DNS 服务器、IP地址、 网络掩码等。可以重置一个或多个IP地址。“释放”或“更新”按钮分别释放或更新一个IP地址。如果希望释放或更新所有IP 地址&#xff0c;请单击“全部释放”或“全部更新”。其他工动态IP地址的捕捉&#xff0c; Windo…

双指针解题

验证回文数&#xff08;验证回文数-CSDN博客&#xff09;和判断在子序列&#xff08;判断子序列-CSDN博客&#xff09;已经在之前进行了计算&#xff0c;今天有三个新的双指针问题&#xff1a; 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0…

堆的认识和堆的操作

一.堆的认识: ① 也就是说它取出的顺序是需要搜索的,查找特定性质。 ② 数组:总是插入尾部(1),查找(n)移动元素删除特性(n) 链表:头插或尾插(1),查找(n)删特性(1) 所以为什么要调整顺序?就是为了查找特性方便。 有序数组:找到合适位置(n)移动元素插入(n),删除最…

HMM地图匹配算法库Barefoot环境搭建

1.引入gps路径匹配开源项目barefoot 克隆仓库 git clone https://github.com/bmwcarit/barefoot.git打开项目执行mvn命令将项目打包到maven仓库 mvn install -DskipTests在自己的maven项目中引入barefoot依赖 <dependency><groupId>com.bmw-carit</groupId&g…

第五篇 加法器

实验五 加法器 5.1 实验目的 掌握半加器和全加器的基本原理 掌握串行进位加法器的基本原理 掌握使用全加器实现串行进位加法器的基本原理 熟悉Verilog 代码设计 5.2 原理介绍 5.2.1 半加器 半加器和全加器是算数运算电路中的基本单元&#xff0c;它们是完成1位二进制数…

PDA怎么编程:深度探索PDA编程的四大领域、五大步骤、六大技巧与七大注意事项

PDA怎么编程&#xff1a;深度探索PDA编程的四大领域、五大步骤、六大技巧与七大注意事项 在数字化时代&#xff0c;PDA&#xff08;个人数字助理&#xff09;作为一种便携式的智能设备&#xff0c;其编程能力日益受到关注。然而&#xff0c;对于许多初学者来说&#xff0c;PDA…

【leetcode--最后一个单词的长度】

给你一个字符串s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开&#xff0c;返回字符串中最后一个单词的长度。 第一次解法&#xff1a; class Solution:def lengthOfLastWord(self, s: str) -> int:n len(s)j 0for i in range(n-1, -1, -1):if s[i]…

centos 环境 nginx 安装及常用命令简介

一、引言 Nginx 是一个高性能的HTTP和反向代理服务器&#xff0c;因其卓越的性能、丰富的功能集、简单的配置和低资源消耗而广受欢迎。本文将详细介绍如何在CentOS系统中安装Nginx&#xff0c;并简要介绍一些常用的Nginx命令。 二、在CentOS中安装Nginx 1.先检查服务器 GCC …

K-means聚类模型算法的应用与原理

K-means聚类是一种非常流行的聚类算法&#xff0c;它的目标是将n个样本划分到k个簇中&#xff0c;使得每个样本属于与其最近的均值&#xff08;即簇中心&#xff09;对应的簇&#xff0c;从而使得簇内的方差最小化。K-means聚类算法简单、易于实现&#xff0c;并且在许多应用中…

《MySQL索引》学习笔记

《MySQL索引》学习笔记 MySQL的体系结构存储引擎简介InnoDB简介MyISAM简介 索引索引结构BTreeHash索引思考索引分类 索引语法SQL性能分析索引使用最左前缀法则 索引失效的情况范围查询索引列运算字符串不加引号模糊查询or连接的条件数据分布影响 SQL提示覆盖索引前缀索引单列索…

Ubuntu安装Meatsploit2024.6.4

1、安装metasploit cd /opt && wget https://downloads.metasploit.com/data/releases/metasploit-latest-linux-x64-installer.run && wget https://downloads.metasploit.com/data/releases/metasploit-latest-linux-x64-installer.run.sha1 && echo…

操作系统复习-linux的进程管理

linux的进程管理 linux进程的相关概念 进程的类型 前台进程 前台进程就是具有终端&#xff0c;可以和用户交互的进程&#xff0c;会占用终端shell&#xff0c;不可以输入其他的命令。 后台进程 前台进程就是具有终端&#xff0c;可以和用户交互的进程。 不会占用终端shell&a…

macOS的word没有zotero怎么办

打开zotero,首选项,引用,重新安装加载项 然后到word里 点模板和加载项 把zotero勾上,OK了

Java学习【认识异常】

Java学习【认识异常】 认识异常异常的种类异常的作用 异常的处理方式JVM默认的处理方式捕获异常finally 多个异常的处理异常中的方法抛出异常 自定义异常 认识异常 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常 异常的种类 Error代表的是系统级别的错误&a…

ClickHouse 使用技巧总结

文章目录 数据导入、导出技巧外部文件导入导技巧使用集成表引擎导入、导出数据 建表技巧表引擎选择技巧分区键选择技巧数据结构选择技巧分区技巧 高级技巧物化视图投影位图变更数据捕获 常见报错及处理方法 数据导入、导出技巧 外部文件导入导技巧 ClickHouse作为OLAP即席分析…

每日一题《leetcode--206.反转链表》

https://leetcode.cn/problems/reverse-linked-list/ 这道题可以定义一个新结点newhead&#xff0c;newhead指向NULL。此时遍历所给链表将遍历的每个结点头插到newhead上。 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* curhead;struct ListNode* n…

Spring中的核心概念

黑马程序员SSM框架教程 文章目录 一、IoC二、DI三、目标&#xff1a;充分解耦 一、IoC IoC&#xff08;Inversion of Control&#xff09;控制反转 使用对象时&#xff0c;由主动new产生对象转换为外部提供对象&#xff0c;此过程中对象创建控制权由程序转移到外部&#xff0c…

Visual Studio 2022开发CTP的问题汇总

订阅合约的函数原型如下 virtual int SubscribeMarketData(char *ppInstrumentID[], int nCount) 0;参数定义 char* ppInstrumentID[] { "rb2410", "sc2407" }; 报错&#xff1a;E0144 “const char *” 类型的值不能用于初始化 “char *” 类型的实体 …