MySQL中一条更新语句是怎么执行的?

假设,创建一个InnoDB表t并插入数据如下:

CREATE TABLE `t` (`id` int(11) NOT NULL,`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `a` (`a`)
) ENGINE=InnoDB;
insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

现在执行一条修改语句:

update t set a=6 WHERE id =5;

假设当前数据库的隔离级别是可重复读,这条修改语句在mysql中是怎么执行流程是怎样的呢?

下面是详细的执行步骤:

1、查询解析和优化

  • MySQL首先解析更新语句,检查语法。
  • 然后优化器评估执行计划,选择使用哪个索引来定位记录。

2、打开表和索引

  • 打开表t,为其设置意向锁,准备修改数据。

3、InnoDB Buffer Pool

  • MySQL会检查要更新的行是否已经在InnoDB缓冲池(buffer pool)中。
  • 如果不在,则从磁盘读取到缓冲池。
  • 由于需要修改数据,因此这个行被标记为脏页(dirty page)。

4、锁定记录

  • 加锁阶段,因为使用的是可重复读隔离级别,InnoDB会对找到的索引记录加上next-key锁(结合行锁和gap锁),防止幻读。

5、Redo Log Buffer

  • 在数据被修改前,修改操作被写入到重做日志缓冲区(redo log buffer),确保数据库的持久性。

6、索引更新

  • 实际修改内存中缓冲池的记录,包括聚集索引的行记录以及任何受影响的二级索引(secondary index)。

7、Change Buffer

  • 如果涉及到非唯一二级索引的修改,并且目标页面不在缓冲池中,修改可能会首先写入到change buffer(之前称为插入缓冲insert buffer)中,以减少磁盘I/O操作。

8、Redo Log

  • redo log buffer中的内容刷(flush)到磁盘上的重做日志文件(redo log)中,通常是在事务提交时进行,确保即使发生崩溃,修改也不会丢失。

9、binlog_cache

  • 如果开启了二进制日志(用于复制和/或恢复),修改操作同时被格式化后写入到binlog_cache中。

10、事务提交

  • 用户如果执行了提交(COMMIT)操作,事务将会提交。
  • 提交时,redo log buffer的内容会被刷到磁盘上的redo log文件中(如果尚未刷盘)。
  • 此时,undo log记录也会生成,以便在必要时候可以回滚事务。

11、binlog

  • 提交时,binlog_cache中的内容会被刷(flush)到磁盘上的二进制日志文件(binlog)中。

12、清理锁和缓冲池写回

  • 提交完成后,释放所有在事务过程中获取的锁。
  • 最终,InnoDB后台线程会负责将脏页从缓冲池刷回到磁盘上。

整个流程需要注意的是,某些步骤可能会有重叠,并不是完全线性的,比如redo log buffer可能在修改操作进行的同时就逐渐被写入到redo log中,而不一定要等到整个事务提交。同时,为了提高效率,很多操作都是批量处理的,例如缓冲池的写回并不会立即发生,而是由InnoDB的后台线程按需批量刷盘。还有,锁的粒度和类型会根据实际操作、存在的索引、隔离级别等多种因素有所变化。

注意:不同的mysql版本执行流程也略有差异。

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

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

相关文章

测试用例相关问题

1.什么是测试用例 测试用例是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而…

【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数

本文涉及知识点 动态规划汇总 图论 深度游戏搜索 归并排序 组合 LeetCoce1569将子数组重新排序得到同一个二叉搜索树的方案数 给你一个数组 nums 表示 1 到 n 的一个排列。我们按照元素在 nums 中的顺序依次插入一个初始为空的二叉搜索树(BST)。请你统…

CI/CD Pipeline的构建流程,如何在工作中正确应用它?

前言 大家好,我是chowley,今天来讲解一下CI/CD这个热门概念。 在当今快节奏的软件开发环境中,CI/CD(Continuous Integration/Continuous Delivery)已经成为提高开发效率、确保软件质量的关键实践。 本文将介绍CI/CD…

精选6款前端动画特效分享(附在线演示)

分享6款好玩的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS日食与太阳碰撞动画 一款基于CSS实现的日食动画特效 碰撞物体会从右侧旋转向太阳靠近重合而后…

程序员成被裁最多的职业,互联网成围城,“转码”神话破灭?

随着互联网蓬勃发展,“转码”一直被视为找不到工作时的灵丹妙药。所谓转码,就是转行成为程序员。专业太偏?没关系,可以转码。失业了?没关系,可以转码。不知道该做什么工作?那就转码吧。程序员薪…

idea提交代码到git或svn上时,怎么忽略.class、.iml文件和文件夹等不必要的文件

第一种方法 在Setings–> Editor --> File Types -->Ignore files and folders中添加需要忽略的文件和文件夹: .idea 忽略 .idea 的文件或者文件夹 *.iml 忽略后缀为iml的文件 target 忽略target 文件或目录以及目录下的所有文件注…

Linux学习之文件系统与动静态库

目录 一,文件的管理 什么是磁盘? 磁盘的逻辑抽象结构 格式化 inode 挂载 软硬链接 二,动静态库 什么是动静态库? 1.站在库的制作者角度 静态库: 制作一个静态库 2.站在静态库使用者的角度 动态库 作为制…

Go语言基础之反射

1.变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息。值信息:程序运行过程中可动态变化的。 2.反射介绍 反射是指在程序运行期间对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址&#xff…

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据1

内容参考于:易道云信息技术研究院VIP课 上一个内容:升级Notice类获得背包基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:3be017de38c50653b…

操作日志应记录编辑的前后内容变化

总体思路是增加一个注解类,将注解加到要进行记录变化的Java类属性上却可。 上代码: 1. 实现注解类: Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface FieldName {String value();boolean isIgnoreNull()…

day34_js

今日内容 0 复习昨日 1 事件 1.1 事件介绍 1.2 事件绑定方式 1.3 不同事件的演示 2 DOM操作 2.1 概述 2.2 查找元素 2.3 元素内容的查找和设置 2.4 元素属性的查找和设置 2.5 元素CSS样式的查找和设置 2.6 创建元素 2.7 创建文本节点 2.8 追加元素 2.9 删除元素 3 案例练习 0 复…

TCP 异常断开连接【重点】

参考链接 https://xiaolincoding.com/network/3_tcp/tcp_down_and_crash.html https://xiaolincoding.com/network/3_tcp/tcp_unplug_the_network_cable.html#%E6%8B%94%E6%8E%89%E7%BD%91%E7%BA%BF%E5%90%8E-%E6%9C%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93 关键词&#xff1a…

无际线复选框

效果演示 实现了一个网格布局,其中每个网格是一个复选框,可以选择是否显示。每个复选框都有一个漂浮的天花板,表示它是一个房间的天花板。每个房间的天花板都有一个不同的形状和颜色,分别对应不同的房间。整个页面的背景是一个由两…

echarts多个折线图共用X轴,实现tooltip合并和分离

echarts共享X轴案例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</…

一、提升专注力的完整指南(The Complete Guide to Increasing Your Focus)- Scott Young

Focus is one of your most valuable resource.It acts as a multiplier on the value of your time.An hour of absorbing focus can be worth ten times that of a distracted one. 专注力是你的最宝贵的资源之一。它就像一个乘数因子&#xff0c;让时间的价值翻倍。全神贯注…

<el-date-picker>时间戳单位

神级操作&#xff0c;搞了半天&#xff0c;秒是大X&#xff0c;毫秒是小x&#xff0c;yue了。 // 秒 <el-date-pickerv-model"timestamp"value-format"X" ></el-date-picker>// 毫秒 <el-date-pickerv-model"timestamp"value-fo…

DevSecOps核心流程基本组成分析

目录 一、DevSecOps核心流程基本组成 1.1 核心流程概述 1.2 DevSecOps 核心流程说明 1.2.1 核心流程图 1.2.2 流程说明 1.2.2.1 持续开发 1.2.2.2 持续构建 1.2.2.3 持续运维 1.2.2.4 持续监控 二、DevSecOps核心流程经典场景 2.1 Azure DevSecOps核心流程 2.1.1 核…

OpenCV 3 - Mat对象介绍

1 Mat对象与IplImage对象 Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分lpllmage是从2001年OpenCv发布之后就一直存在,是c语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序…

HCIA-HarmonyOS设备开发认证-3.内核基础

目录 前言目标一、进程与线程待续。。。 前言 对于任何一个操作系统而言&#xff0c;内核的运行机制与原理是最为关键的部分。本章内容从多角度了解HarmonyOS的内核运行机制&#xff0c;涵盖进程与线程的概念&#xff0c;内存管理机制&#xff0c;网络特性&#xff0c;文件系统…

HTTP连接池在Java中的应用:轻松应对网络拥堵

网络拥堵是现代生活中无法避免的问题&#xff0c;尤其是在我们这个“点点点”时代&#xff0c;网页加载速度直接影响到我们的心情。此时&#xff0c;我们需要一位“救世主”——HTTP连接池。今天&#xff0c;就让我们一起探讨一下&#xff0c;这位“救世主”如何在Java中大显神…