一条sql语句是怎么执行的?

一、问题

InnoDB存储引擎,执行了下列语句:

UPDATE user SET name = "小明" WHERE id=1002;

其中id是主键,这条SQL语句的执行过程是怎样的?

二、答案

首先客户端与MySQL连接器进行连接,然后分析器经过词法分析和语法分析,然后到达优化器,优化器生成执行计划,选择索引,这里选择主键索引id,然后就到达了执行器,执行器调用存储引擎,存储引擎返回结果。

具体而言,在执行器调用存储引擎时都发生了下面这些事儿:

1. 从磁盘加载到内存

首先存储引擎在缓冲池中查找该数据页,如果缓冲池中没有id=1002的记录,会在B+树上查找数据页。一般来说,一个表的B+树索引根节点在数据库启动时就放在缓冲池。对根节点根据id=10进行二分查找,然后把子节点磁盘块加载到缓冲池继续二分查找,然后把叶子节点磁盘块加载到缓冲池继续二分查找。对页进行二分查找是在页目录中查找合适的槽。一旦确定了槽,就去查找槽里面的一行一行记录,根据每个记录行格式上的next_record字段遍历单链表,直到找到目标记录。

2. 写入缓冲池

然后会写到缓冲池中,由于这个页面之前不在缓冲池,会在free链表上取一个空闲缓冲页的控制块填写信息,然后这个控制块从free链表移除,然后将控制块放到lru链表的冷数据区头部。最后将记录返回给server层的执行器。

3. 写入Undo日志

执行器更新数据前,Undo日志会写下更新前的数据,然后将写好的Undo日志写到update undo log链上,最终这个Undo页面链表会放到系统表空间的某个回滚段下的Undo Log Segment中。由于这是一个没有修改主键的UPDATE语句,只会产生一个Undo日志。把这个Undo日志使用头插法挂在这行记录的roll_pointer下,形成一条Undo版本链。

4. 执行器修改

执行器设置name="小明",再调用执行引擎的接口写入新的数据。

5. 更新缓冲池

执行引擎将这行新的数据更新到缓冲池中。在flush链表中记录这个缓冲页控制块,同时lru链表会把这个控制块从冷数据区移动到热数据区的头部。

6. 写入Redo日志和Bin日志

随后将更新的记录写到Redo日志中,Redo日志会写到Redo Log Buffer,此时Redo日志处于prepare状态,事务提交之前会将Redo Log Buffer的Redo日志刷盘到Redo Log File,随后告诉执行器事务“可以提交”,存储引擎会根据操作写Bin Log到磁盘。写入Bin Log之后,事务成功提交,存储引擎再把Redo日志的prepare状态改成commit状态。

7. 脏页刷盘

数据库的后台线程会定时从flush链表中刷新一部分脏页到磁盘文件中。

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

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

相关文章

MySQL数据库迁移到DM8数据库

1. 达梦新建zsaqks库 2. 打开DM数据迁移工具 3. 新建工程 4. 迁移 - 右击 - 新建迁移 下一步 5. 选择迁移方式 6. MySQL数据源 请输入MySQL数据库信息 7. DM数据库目的 请输入达梦数据库信息 8. 迁移选项 保持对象名大小写(勾选) 9. 指定模式 指定是从数据源复制对象。 10.…

Qt 练习做一个登录界面

练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…

minikube 的 Kubernetes 入门教程--(五)

本文记录 Minikube 在 Kubernetes 上安装 WordPress 和 MySQL。 这两个应用都使用 PersistentVolumes 和 PersistentVolumeClaims 保存数据。 在深入这些步骤之前&#xff0c;先分享来自kubernetes.io教程。 链接>>使用持久卷部署 WordPress 和 MySQL | Kubernetes 获…

HarmonyOS 私仓搭建

1. HarmonyOS 私仓搭建 私仓搭建文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5   发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5]…

根据问题现象、用户操作场景及日志打印去排查C++软件问题,必要时尝试去复现问题

目录 1、概述 2、通过现有信息无法定位问题时&#xff0c;则需要尝试去复现问题 3、非崩溃问题与崩溃问题的一般排查思路 3.1、非崩溃问题的排查思路 3.2、崩溃问题的排查思路 4、难以复现问题的可能原因总结 4.1、问题难以复现&#xff0c;可能和某种特殊的业务场景或操…

《JVM第3课》运行时数据区

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 运行时数据区结构图如下&#xff1a; 可分为 5 个区域&#xff0c;分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。这里大概介绍一下各个模块的作用&#xff0c;会在后面的文章展开讲。 类加载子系统会把类信息…

class 100 KMP算法原理和代码详解

1. KMP 算法介绍 1.1 暴力方法 暴力方法就是将两个字符串进行一个一个比较 这个知道就行了, 我们的重点是 KMP 算法 1.2 KMP 算法介绍 暴力方法的时间复杂度是&#xff1a;O(n * m), 使用 KMP 算法可以将时间复杂度优化到&#xff1a;O(n m). 暴力方法时间慢的原因是&…

不基于Gin手撸一个RPC服务

目标 实现一个GRPC框架&#xff0c;可以通过grpc-ui来对接口进行访问。也可以使用client来直接调用服务端服务 准备&#xff08;这边以Mac系统举例&#xff09; 安装homebrew&#xff08;如果没有安装的话&#xff09; /bin/bash -c "$(curl -fsSL https://raw.github…

大数据治理:策略、技术与挑战

随着信息技术的飞速发展&#xff0c;大数据已经成为现代企业运营和决策的重要基础。然而&#xff0c;大数据的复杂性、多样性和规模性给数据管理带来了前所未有的挑战。因此&#xff0c;大数据治理应运而生&#xff0c;成为确保数据质量、合规性、安全性和可用性的关键手段。本…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

宝藏虚拟化学习资料大全

最近发现了关于虚拟化的宝藏资料&#xff0c;瑞斯拜&#xff01;原文链接如下&#xff1a; 500篇关于虚拟化的经典资料&#xff0c;含CPU虚拟化&#xff0c;磁盘虚拟化&#xff0c;内存虚拟化&#xff0c;IO虚拟化。 目录 &#x1fa90; 虚拟化基础 &#x1f343; 虚拟化分类&…

【源码+文档】基于SpringBoot+Vue旅游网站系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

移植 AWTK 到 纯血鸿蒙(HarmonyOS NEXT)系统 (0) - 序

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (0) - 序 前段时间纯血鸿蒙系统 HarmonyOS 5.0&#xff08;又称 HarmonyOS NEXT&#xff09;正式推出&#xff0c;这是继苹果 iOS 和安卓系统后&#xff0c;全球第三大移动操作系统。纯正国产操作系统登场&#xff0c;国人无不欢…

docker-compose安装rabbitmq 并开启延迟队列和管理面板插件(rabbitmq_delayed_message_exchange)

问题&#xff1a; 解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange &#xff1a;plugins_not_found 我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:156…

SpringBoot AOP介绍、核心概念、相应实现

文章目录 AOP介绍AOP的核心概念切面(Aspect)切点(Join Point)语法具体解释 增强(Advice)织入(weaving) 相应实现权限校验日志输出 AOP介绍 AOP全称Aspect Oriented Programming意为面向切面编程&#xff0c;通过预编译和运行期间通过动态代理来实现程序功能统一维护的技术。AO…

Python 数据结构对比:列表与数组的选择指南

文章目录 &#x1f4af;前言&#x1f4af;Python中的列表&#xff08;list&#xff09;和数组&#xff08;array&#xff09;的详细对比1. 数据类型的灵活性2. 性能与效率3. 功能与操作4. 使用场景5. 数据结构选择的考量6. 实际应用案例7. 结论 &#x1f4af;小结 &#x1f4af…

CSS 超出一行省略号...,适用于纯数字、中英文

文本超出显示省略号... 代码&#xff1a; .ellipsis{ overflow: hidden; -webkit-line-clamp:1; text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; word-break: break-all; /** 纯数字、中英文都适用 */ }

C/C++中标准的输入输出

一、c语言的标准输入输出 c语言的标准输出函数式printf&#xff0c;它可以将用户设置的变量输出到控制台&#xff1b;标准的输入函数式scanf&#xff0c;接收用户在控制台的输入数据&#xff0c;注意&#xff0c;如果使用的是visual stdio编译器&#xff0c;会提示使用scanf_s…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能&#xff0c;广泛…