MySQL高级(二):一条更新语句是如何执行的

news2024/11/15 20:26:47

执行步骤

1. 解析 SQL 语句

MySQL 首先会解析你输入的 UPDATE 语句。解析器会检查语法是否正确,并将 SQL 语句转化为内部的数据结构(通常是语法树)。

示例 SQL 语句:

UPDATE employees SET salary = 5000 WHERE department = 'Sales';

2. 查询优化

MySQL 会根据查询优化器来决定如何高效执行该更新操作。优化器会生成不同的执行计划并选择最优的执行路径。这一步对于 UPDATE 语句通常意味着决定如何检索要更新的记录,以及使用哪些索引(如果有的话)。

  • 如果 WHERE 子句中有索引,优化器会考虑使用索引来提高查询速度。
  • 如果没有索引,可能会进行全表扫描。

3. 确定要更新的记录

在执行 UPDATE 操作时,MySQL 会根据 WHERE 子句来确定哪些记录需要被更新。在这个过程中,MySQL 会:

  • 使用索引(如果有的话)查找符合条件的记录。
  • 如果没有索引,则会全表扫描,逐行检查。

4. 锁定涉及的行

为了保证数据一致性,MySQL 会在对数据进行更新时使用锁机制,防止其他事务修改同一行数据。这可以是行级锁或表级锁,具体取决于存储引擎(例如 InnoDB)以及事务的隔离级别。

  • InnoDB 存储引擎:通常使用行级锁。
  • MyISAM 存储引擎:使用表级锁。

5. 执行更新

MySQL 会在符合条件的记录上执行更新操作。它会计算新的字段值,并将其写入数据页。这个步骤涉及以下几个方面:

  • 修改数据页:更新操作会修改数据页中的内容。
  • 记录日志:MySQL 会将更新操作记录到事务日志(如 redo logbinlog),以便后续的事务恢复或复制。

6. 提交或回滚事务

如果更新操作是在事务中进行的:

  • 如果事务提交,更新会被永久保存。
  • 如果事务回滚,所有更新会被撤销。

在 InnoDB 存储引擎中,更新操作是通过“日志”的方式确保可恢复性的,即使系统崩溃也可以恢复到一致的状态。

7. 提交更新(对于非事务型存储引擎)

对于非事务型存储引擎(如 MyISAM),MySQL 会立即将更新写入磁盘,不需要提交事务。

redo logbinlog

在 MySQL 中,redo logbinlog 都是用于事务日志记录的重要机制。

redo log

Redo Log(重做日志)是 MySQL InnoDB 存储引擎使用的一种日志类型,它主要用于确保事务的持久性(即 ACID 中的 Durability)和故障恢复。Redo Log 记录了所有对数据库的修改操作,这些修改是为了能够在系统崩溃后,保证数据的一致性和恢复。

特点

  • 事务日志:Redo log 记录的是事务执行过程中对数据页的修改操作,确保即使数据库发生崩溃,也可以通过 redo log 恢复数据。
  • 物理日志:Redo log 记录的是物理层面的变化,即实际的数据修改操作(如页的更新、插入或删除行等),并不像 binlog 记录的是 SQL 语句。
  • 日志缓冲区:InnoDB 会将事务修改的日志先写入到 日志缓冲区(log buffer)中,再定期将这些日志刷写到 redo log 文件
  • 重做:在系统崩溃时,通过 redo log,MySQL 可以重做(redo)未提交的事务,以确保数据不会丢失(即持久性)。
  • 写入顺序:Redo log 是顺序写入的,通常比数据库数据页的更新要快得多。

工作流程

  1. 事务修改数据时,InnoDB 会首先将修改的日志写入 redo log buffer
  2. 每隔一定时间(或者当 buffer 满时),Redo log 会刷新到磁盘的 redo log 文件(通常是 ib_logfile0ib_logfile1)。
  3. 在崩溃恢复时,MySQL 使用 redo log 中的记录来重做所有未完全持久化的数据修改,确保数据一致性。

例子

  • 你执行 UPDATE employees SET salary = 5000 WHERE id = 1;,修改了数据库中的某个数据页。
  • 这个修改操作会先被记录到 redo log 中,而不会立即更新磁盘上的数据页(InnoDB 会将其缓存在内存中)。
  • 如果系统崩溃,在恢复时,InnoDB 会通过 redo log 重做未完成的操作。

binlog

Binlog(二进制日志)是 MySQL 用来记录所有对数据库执行的修改操作的日志,主要用于数据的备份、恢复和主从复制。Binlog 记录的是 逻辑层面的操作(SQL 语句或者事件),而不是直接的物理数据修改。

特点

  • 逻辑日志:Binlog 记录的是 SQL 语句(如 INSERTUPDATEDELETE)或者逻辑事件(如表结构变更)执行的结果,而不是物理的页面修改。
  • 主从复制:Binlog 是 MySQL 主从复制的核心,主服务器的所有修改操作(如 INSERTUPDATE 等)会被记录在 binlog 中,然后从服务器会从 binlog 中读取这些事件并执行相应的 SQL 语句来保持数据同步。
  • 持久性和一致性:Binlog 是一个逻辑日志,用来记录数据变更的操作。它也可以用于数据恢复和备份。
  • 不同的格式:Binlog 支持三种格式:
    • STATEMENT:记录 SQL 语句。
    • ROW:记录每一行数据的具体变化。
    • MIXED:混合模式,结合了 STATEMENT 和 ROW 两种模式。

工作流程

  1. 在执行一个更新操作时(例如 UPDATE employees SET salary = 5000 WHERE department = 'Sales';),该 SQL 语句会被记录到 binlog 中。
  2. Binlog 事件会被顺序写入磁盘中的二进制文件,通常是 mysql-bin.000001 这种格式。
  3. 在主从复制中,从服务器会读取 binlog 中的事件,并通过执行这些事件来同步数据。

例子

  • 你执行 INSERT INTO employees (id, name, salary) VALUES (1, 'Alice', 5000);,该语句会被记录到 binlog 中。
  • 主服务器上的所有修改都会写入 binlog,从服务器会读取并执行这些语句,保持与主服务器的数据一致性。

区别

特性Redo LogBinlog
目的用于事务持久化和崩溃恢复用于数据备份、恢复和主从复制
记录内容物理修改操作(数据页变化)逻辑操作(SQL 语句或者事件)
存储位置存储在 InnoDB 存储引擎的 redo log 文件中存储在 MySQL 的 binlog 文件中
更新频率持续且高频的写入,写入日志缓冲区以事件为单位记录,通常是较低频率的写入
恢复方式在崩溃恢复时,重做未提交的事务,保证数据一致性可以用于主从复制,也可用于基于事件的恢复
是否跨服务器复制不参与主从复制,只与本地数据库相关是的,支持主从复制和基于 binlog 的数据恢复

总结

  • Redo Log:是 InnoDB 用来确保事务持久性和恢复操作的一种机制,记录了对数据页的物理修改。它用于系统崩溃后的恢复。
  • Binlog:记录了数据库的逻辑变化(SQL 语句或事件),用于数据的备份、恢复以及主从复制。

两者各自担任不同的角色,Redo Log 主要用于事务的持久性崩溃恢复,而 Binlog 则用于数据复制备份恢复

总结

  1. 解析:解析 SQL 语句。
  2. 优化:选择最佳执行计划。
  3. 查找记录:根据 WHERE 条件查找符合更新条件的记录。
  4. 锁定行:锁定符合条件的记录,防止其他事务并发修改。
  5. 更新数据:执行实际的更新操作,修改数据页,并记录日志。
  6. 事务处理:事务提交或回滚(如果是事务型存储引擎)。

影响性能的因素

  • 索引WHERE 子句中的字段是否有索引。
  • 表的大小:表中数据量越大,更新操作的成本越高,特别是没有合适索引时需要全表扫描。
  • 事务隔离级别:事务的隔离级别(如 READ COMMITTEDSERIALIZABLE)也会影响锁的粒度及更新的性能。
  • 表的存储引擎:不同的存储引擎(InnoDB vs MyISAM)会影响更新的行为,尤其是在事务和锁的处理上。

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

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

相关文章

2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享

一、背景特殊医学用途配方食品简称特医食品,是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要,专门加工配置而成的配方食品,包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…

Ubuntu 的 ROS 2 操作系统安装与测试

引言 机器人操作系统(ROS, Robot Operating System)是一种广泛应用于机器人开发的开源框架,提供了丰富的库和工具,支持开发者快速构建、控制机器人并实现智能功能。 当前,ROS 2 的最新长期支持版本为 Humble Hawksbil…

SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间

SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…

pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named ‘XXX‘异常的解决办法

网上各种各样的:1、关于_pycache_影响conftest的;2、目录路径的;3、配置环境的; 4、发现自己是powershell后,设置环境: $env:environment"local" 仍然报错的:5、最后发现是自己的 …

JAVA:探索 EasyExcel 的技术指南

1、简述 在 Java 开发中,Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案,特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景,并通过实例展示其基本用法…

Python自动化小技巧24——实现自动化输出模板表格报告

背景 很多人拿到数据excel文件,然后要写报告,做表格,要各种计算,各种排序,分组聚合,数据透视,然后合并单元格,添加边框,加粗,添加显示规则,添加数…

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)

目录 一、前言 二、栈是排列方式 三、栈的单词 四、程序中的栈 五、栈的方法 1.声明并初始化栈 2.往栈里放东西(学名:入栈) 3.从栈往外拿东西 (学名:出栈) 4.清空栈 5.遍历 Stack 6.获取Stack的长…

Vue全栈开发旅游网项目(10)-用户管理后端接口开发

1.异步用户登录\登出接口开发 1.设计公共响应数据类型 文件地址:utils/response404.py from django.http import JsonResponseclass BadRequestJsonResponse(JsonResponse):status_code 400def __init__(self, err_list, *args, **kwargs):data {"error_c…

PostgreSQL中如果有Left Join的时候索引怎么加

在PostgreSQL中,当你的查询包含多个LEFT JOIN和WHERE条件时,合理地添加索引可以显著提高查询性能。以下是一些具体的优化步骤和建议: 1. 分析查询 使用 EXPLAIN ANALYZE 命令分析你的查询,了解查询的执行计划,识别出连…

A027-基于Spring Boot的农事管理系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多,绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能(Vue2Vue3) 二、什么是Vue 概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 的 渐进式 框架…

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

我们都知道时钟树综合在数字IC后端实现中的重要性。做clock tree主要有传统clock tree做法,H tree,Flexible H-tree,fishbone等做法。接下去小编将拿cadence官方的这份Innovus Flexible H-tree and Multi-Tap Clock Flow和对应的lab data来做…

【MySQL】MySQL数据库安装以及报错处理技巧

前言: 本节内容讲述在Ubuntu环境下怎么进行MySQL的安装。 以及一些安装过程中遇到的报错如何处理的问题。 ps:注意, 本篇文章不是图形化界面的MySQL安装教程哦。想要安装图形化界面的MySQL的友友们可以另寻资源了。 目录 更新软件包列表 安装M…

ISP——你可以从这里起步(二)

接上一篇,上一篇是原理篇,这一篇是实战篇,为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图,即使获得了raw图也需要对应的sensor参数才能把它用起来,所以我找了一条野路子可以把…

CTF攻防世界小白刷题自学笔记14

fileclude,难度:1,方向:Web 题目来源:CTF 题目描述:好多file呀! 给一下题目链接:攻防世界Web方向新手模式第17题。 打开一看,这熟悉的味道,跟上一篇文章基本一摸一样的&#xff…

CTFHub每日练习

文章目录 技能树CTF Web信息泄露目录遍历PHPINFO备份文件下载网站源码bak文件vim缓存.DS_Store Git泄露Logstash index方法一方法二 密码口令弱口令 技能树 CTF Web 信息泄露 目录遍历 PHPINFO 备份文件下载 网站源码 当开发人员在线上环境中对源代码进行了备份操作&#x…

使用CNN进行验证码识别:深度学习与图像预处理教程

验证码(CAPTCHA)广泛用于区分人类和自动化程序(如机器人),通常由扭曲的字母、数字或符号组成。为了实现验证码的自动识别,深度学习尤其是卷积神经网络(CNN)非常有效。本文将带你一起…

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…

讯飞、阿里云、腾讯云:Android 语音合成服务对比选择

在 移动端 接入语音合成方面,讯飞和腾讯云等都是优秀的选择,但各有其特点和优势。咱们的需求是需要支持普通话/英语/法语三种语言,以下是对各个平台的详细比较: 一、讯飞语音合成介绍 与语音听写相反,语音合成是将一段…

python爬虫获得店铺的所有商品

在编写Python爬虫以获取店铺的所有商品信息时,通常涉及到发送HTTP请求、解析响应内容以及处理API返回的数据。以下是一个详细的Python爬虫示例,用于获取店铺的商品信息。这个示例假设API返回的是JSON格式的数据,并且需要API密钥进行认证。 步…