深入浅出Mysql 第二期

news2024/11/16 3:23:30

从更新语句中看日志系统

探究技术的本质,享受技术的乐趣!由于时间原因以及自己的原因导致拖更了,不过没关系,我保证后面每天一更,周末休息!好了,闲话少说,今天我们通过一个更新操作去认识一下Mysql的日志系统

首先我们先来看看我们的表结构以及更新语句的执行计划

# 准备工作
CREATE TABLE user_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(32) NOT NULL,
    age TINYINT NOT NULL
);
insert into user_info (name,age) values ('pandaer',20)

# 更新语句
update user_info set age = age + 1 where id = 1

准备工作完成之后,我们先来回顾一下Mysql的架构设计,在Server端,一条SQL的语句的执行流程是这样的,SQL语句从连接器到达解析器,解析器进行一定的语法分析与语义分析知道了这条SQL是干什么的,然后优化器进行优化处理,并知道了为了执行这条SQL,应该怎么一步一步来做,将这些步骤组合成一个执行计划,并把这个执行计划交给执行器来做,执行器将具体的需要和磁盘打交道的操作委派给了存储引擎。这就是一条SQL的大致执行流程。更新语句的执行流程类似,只不过在执行过程中还会涉及到两个日志,一个是redo log 一个是bin log, 具体的过程是这样的:当SQL语句流转到执行器的时候,也就是SQL语句变成了一步一步的执行计划,SQL通过id的主键索引,利用范围查找,找到id=1的记录,并更新这条记录的age字段的值。执行计划如下

mysql> explain UPDATE user_info SET age = age + 1 WHERE id = 1;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | UPDATE      | user_info | NULL       | range | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using where |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

就这么简单的过程就涉及到了 redo log,以及bin log,首先我们需要明确redo log和bin log的作用,redo log又叫重做日志,在存储引擎层,也就是并不是全部的存储引擎都有重做日志,目前只有InnoDB有重做日志,它的作用是缓解IO压力,提升系统性能。拿上面那个例子举例,当执行器将内存中的id=1的记录的age值从20改为21之后,就会调用InnoDB的相关的接口,将数据写入磁盘。但是这个写入过程并没有我们想象的那么简单,第一步我们需要找到这条记录在磁盘的位置,然后再写入。而如果记录很多,那么这个查找过程就有点慢了,如果同时又有很多请求来到数据库,那么数据库的压力就会很大,为了解决这个问题,InnoDB给出了重做日志的解决方案,这里需要补充一个知识,追加写的方式IO性能最好。所以当执行器调用存储引擎的写接口的时候,InnoDB只不过是记录了一条日志,即磁盘中的那一块数据发生了改变。当这个日志写入到重做日志之后,就会给执行器返回OK。即写操作完成。然后等到数据库压力不大的时候,在利用这个重做日志去更新真实的数据记录。接着我们再来说说bin log, bin log也叫归档日志,是Server层来支持的,这就意味着与存储引擎无关。归档日志的作用就是用来做备份以及主从同步的。为了实现这个目的,归档日志不得不在每条SQL语句执行完成之后,记录一下。那么就产生了一个问题,归档日志和重做日志的一致性问题。就比如当写完重做日志之后,Mysql崩溃了,那么归档日志和重做日志中的内容就不一致,这样就会导致,主从同步的时候,从节点的数据与主节点的数据不一致问题。为了解决这个问题,Mysql提出来两阶段提交的方式来解决。大致的逻辑是这样的:当执行器委派InnoDB执行写操作的时候,InnoDB记录一条日志到重做日志中后,将状态设置为prepare,然后执行器写完归档日志之后,InnoDB就会将状态设置为commit,利用这种两阶段提交的方式解决了一致性的问题。那么你肯定会问为什么呢?我们不妨分析一下这样做了之后,由几个时间点可能发生崩溃,可以看下方的图

  1. 崩溃时机1,很简单,都没有写入不存在一致性问题
  2. 崩溃时机2,重做日志中有记录,但是归档日志中没有记录,由于标记重做日志为prepare状态,所以在故障恢复的时候就知道存在问题,然后就可以根据归档日志中是否存在这条记录来判断是回滚还是直接设置为commit状态
  3. 崩溃时机3,和时机2一致。

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

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

相关文章

数组案例练习进阶版---对数组中的元素进行排序(冒泡法)

在上篇文章中,我们一起学习了常用排序法中的选择排序法,今天,我们将一起来学习新的排序方法——冒泡法排序 那么首先,什么是冒泡法呢? 首先,第一列,我们有四个大小不一的球,我们称最…

4款ai 制作 ppt工具帮你提高工作效率

在这个高度重视可视化展示的环境当中,PPT在许多的场合中都骑着非常重要的作用,但PPT制作过程却常常令人感到烦恼。而最近我发现了4个堪称神器的PPT制作工具,可以分享给大家。 1、笔灵 ppt 直通车:https://ibiling.cn/ppt-zone 这…

数据结构与算法 - 红黑树

一、概述 1. 历史 红黑树是一种自平衡二叉查找树,最早由一名叫Rudolf Bayer的德国计算机科学家于1972年发明。然而,最初的树形结构不是现在的红黑树,而是一种称为B树的结构,它是一种多叉树,可以用于在磁盘上存储大量…

美国司法部对谷歌反垄断案的最新进展,Google每年给苹果200亿?

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 美国司法部对谷歌反垄断案的前因和最新进展 美国司法部对谷歌的反垄断案是一个复杂且历时长久的法律过程,其核心争议在于谷歌是否利…

CentOS 7.6 安装 Weblogic

注:本教程是以虚拟机作为安装环境,如果您公司需要安装 Weblogic 服务器,请先以虚拟机模拟安装一遍,否则出现失误,概不负责😁。 一、环境 虚拟机:VMware Workstation 16 Linux:Cent…

@Autowired提示:Field injection is not recommended

1、问题 在项目升级版本过程中,Autowired提示Field injection is not recommendedField injection is not recommended Inspection info: Reports injected or autowired fields in Spring components. The quick-fix suggests the recommended constructor-based d…

Linux 下查看 CPU 使用率

目录 一、什么是 CPU 使用率二、查看 CPU 利用率1、使用 top 查看2、用 pidstat 查看3、用 ps 查看4、用 htop 查看5、用 nmon 查看6、用 atop 查看7、用 glances 查看8、用 vmstat 查看9、用 sar 查看10、dstat11、iostat 三、总结 CPU 使用率是最直观和最常用的系统性能指标&…

Linux下自动监控进程运行状态

目录 背景应用举例1、使用crontab脚本监控服务2、使用shell脚本监控服务2.1 编写自定义监控脚本2.2 运行脚本 背景 假设有一个服务需要长期运行,但可能会由于某种原因导致服务意外停止,不能及时发现,某天来到公司后发现出问题了才意识到服务…

【linux】curl命令用法

curl命令认识 curl命令其实在平常工作中就已经在使用了,但是一直没有系统看过,就在这记录下,以后要用的话,可以在这儿查阅。 curl命令写的更清楚一点其实是cURL(client url,客户端URL或者command url命令…

时间复杂度计算方法以及常见题型

时间复杂度是衡量算法运行时间随输入规模增长而增长快慢的一种度量方式。它并不是指算法在特定硬件上的实际运行时间,而是算法在理想环境下执行时间的增长趋势。计算时间复杂度时,我们主要关注算法中执行次数最多的操作(即基本操作&#xff0…

算法板子:匈牙利算法——二分图的最大匹配

目录 1. 基础概念 (1)二分图的概念 (2) 匈牙利算法的作用 2. 代码 1. 基础概念 (1)二分图的概念 顶点集 V 分为两个集合,且图中每条边依附的两个顶点都分属于这两个子集,也就是第…

了解反向代理如何工作吗?

在当今数字化时代,网络通讯扮演着重要的角色,而代理技术为网络通讯提供了更多的灵活性和安全性。作为两种重要的代理技术,代理服务器和反向代理的运行原理和用途各有不同。本文将重点介绍反向代理的运行原理,深入探讨其在网络通讯…

运动耳机哪款好?多方位实测五大风靡网络的爆款,第一款竟然连奥运冠军都在用

随着健康意识的提升,将骨传导耳机作为运动伴侣的国人日益增多,其市场年度销售额已突破新高。然而,作为深耕运动装备领域多年的专家,我深感有责任告诫广大运动爱好者,在选择骨传导耳机时,务必保持警惕&#…

PD虚拟机共享文件夹 PD虚拟机共享蓝牙设备怎么设置 PD虚拟机如何共享文件

PD虚拟机(Parallels Desktop)是为有双系统使用需求人士设计的Mac系统软件。PD虚拟机可以在Mac电脑中设置Windows系统的应用软件。有了PD虚拟机的帮助,大家可以直接在Mac系统中使用其他如Windows的虚拟机系统,除此以外,…

软件RAID配置实战(2个案例场景)

文章目录 3、软件RAID管理-mdadm工具安装mdadm组件格式示例选项说明mdadm命令其它常用选项 4、相关查询命令查看创建RAID的进度查看RAID磁盘详细信息查看文件系统的磁盘空间使用情况 5、RAID配置示例场景1:RAID5步骤 场景2:RAID10步骤 6、移除RAID阵列 接…

031_java.util.concurrent.CopyOnWriteArrayList

继承体系 CopyOnWriteArrayList存在的目的是为了解决在高并发下list的读写。设计上希望只阻塞写行为,不会阻塞读行为。CopyOnWriteArrayList设计就基于此,在内部含有ReentrantLock用作修改时加锁,CopyOnWriteArrayList下有很多可以写方法&…

三种向量相似度计量方法——欧式距离、余弦相似度、皮尔逊相关系数

1、欧式距离 欧氏距离在机器学习可以清晰展示不同对象的相似程度。 欧式距离是最直观的距离度量方法之一,它衡量两个点之间的直线距离, 较小的欧式距离意味着较高的相似度。 分类——K近邻算法(KNN):需要对一个新的样本进行分类…

IIS6 PUT漏洞

一.漏洞描述 IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写⼊的权限,造成任意⽂件上传 1.1环境搭建 环境 fofa:"IIS-6.0" 本地搭建2003 server 1.2漏洞复现 1.开启 WebDAV 和写权限: 1.3 漏洞复现 使…

随笔(三)——项目代码优化

文章目录 一、数据驱动的优化点0.项目技术1.需求说明2. 优化前3.优化后(复杂版)4.优化后(可读性高版) 二、使用循环遍历,减少if-else1.源代码2. 优化后3. 优点 一、数据驱动的优化点 0.项目技术 vue2 view design …

OpenAI 推出 gpt-4o-2024-08-06 模型 解析结构化输出功能 附体验平台

人工智能技术的边界再次被突破,OpenAI 社区迎来了 gpt-4o-2024-08-06 模型的问世,这不仅是一次技术的飞跃,更是对智能助手功能和可靠性的一次全面革新。 技术革新:gpt-4o-2024-08-06 模型的诞生 gpt-4o-2024-08-06 模型是 OpenA…