存储引擎InnoDB下执行一条update的语句要经过哪些步骤呢?假设我们执行如下SQL,本文宏观上将执行器和存储引擎视为一体(执行器和存储引擎交互)。

update user_info set name='岩枭' where id=1 and name='萧炎';

1、Buffer Pool

要执行更新操作,首先要拿到where条件里定位的数据。存储引擎会先在Buffer Pool里找一找有没有这条数据,有则开干,没有的话只能去磁盘读取,然后加载到Buffer Pool。

试想一下,现在磁盘上有一个user.txt文件(简化下only one row)保存了一条用户信息,需要把里面的用户信息修改一下,是不是也需要用程序先读到内存里,处理完再写回磁盘。在这个过程中,需要读取这个用户信息,就可以直接从内存里获取。

2、undo log

执行更新之前,先给undo log写条日志,记录一下原数据信息,万一程序处理异常,事务是需要回滚的,那就需要undo log将数据回滚到更新之前。

试想一想,现在要开始更新从user.txt里加载到内存的数据了,稳妥起见,是不是先打个日志,记录一下更新之前,原来的数据是什么。

3、脏数据

现在把Buffer Pool里的数据进行修改,将’萧炎’,改成’岩枭’,这就产生了所谓的脏数据,因为内存数据已经更新了,但是磁盘数据并未更新。

4、Redo Log

更新内存数据后,再给Redo Log写条日志,记录一下对数据进行了怎样的修改,这样当MySQL宕机后,还能从Redo Log里恢复。Redo Log也有自己的buffer,通常的配置是提交事务时,将Redo Log进行刷盘。

所以没有提交事务时,即使MySQL宕机了也没关系,因为数据都在内存里,客户端也会收到异常。提交事务之后,即使MySQL宕机了还是没关系,MySQL可以根据Redo Log将数据恢复回来。

5、binlog

归档日志,上述步骤完成后,会在binlog里记录一下逻辑日志,简单理解为对哪个数据页的哪条数据进行了怎样的修改。然后将binlog的相关信息写到Redo Log里并打一个commit标记,此次事务就完成了。

6、数据落盘

经过上述步骤后,MySQL服务器内部的IO线程会在某个时刻把内存的数据同步写回磁盘,这样磁盘数据就是最新的数据了。

总结:

其实MySQL也可以看成是一个应用(业务)系统,一条update语句对于MySQL而言就是处理一个业务,为了支持撤销,保证宕机后可恢复,这个应用系统做了很多保障工作。

InnoDB:一条update语句执行过程相关推荐

  1. mysql中一条update的执行过程

    一.Server层阶段: 连接器:负责跟客户端建立连接.获取权限.维持和管理连接 分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等. 优化器:选择索引,生成执行计划. 执行器:根据优 ...

  2. mysql执行两条update语句

    执行两条update语句,没有join关联时 update dp_auto_group_price dagp ,dp_auto_group dag set dagp.is_pub = 0 ,dag.s ...

  3. mysql update from 语句_MySQL高频面试题01期:一条update语句的生命历程

    在有关 MySQL 的面试时,是不是曾经有被问到过:一条 update 语句的生命历程是怎样的?今天就来聊聊这一面试题. 这篇文章通过这条语句进行讲解: update test set a=5 whe ...

  4. MySQL语句执行过程

    目录 前言 MySQL语句执行过程 一.连接器 二.查询缓存 三.分析器 四.优化器 1.逻辑查询优化 1.1 逻辑查询优化思路. 2.2 查询重写规则 2.3 启发式规则再逻辑优化阶段的应用 2.3 ...

  5. MySQL——update 语句执行流程

    图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁: 把更新行记录的旧值写入 undo log(以便回滚): ...

  6. 一条 update 语句的生命历程

    在有关 MySQL 的面试时,是不是曾经有被问到过:一条 update 语句的生命历程是怎样的?今天就来聊聊这一面试题. 这篇文章通过这条语句进行讲解: update test set a=5 whe ...

  7. mysql 查询语句执行顺序_MySQL 查询语句执行过程

    MySQL 查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注的是, ...

  8. mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解

    昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化. 当希望MySQL能够以更高的性能运行查 ...

  9. mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程

    mysql基础架构 示意图 首先 mysql  大概分为 server层 和 存储引擎层 两个部分, 引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB.MyISAM.Memory 等 ...

最新文章

  1. R语言gc函数垃圾回收实战
  2. 二叉树的遍历(包括递归和非递归方法)
  3. 计算机学院 拔河比赛加油词,运动会拔河比赛加油词
  4. 愤怒的小鸟【$DP$优化】
  5. java mysql连接两张表,如何使用Java和MySQL在一个语句中插入两个不同的表?
  6. mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】
  7. 20应用统计考研复试要点(part26)--简答题
  8. python里随机抽取样本_概率分布和抽样分布基础知识及Python实现
  9. UNIX环境高级编程——pthread_create的问题
  10. python简单程序实例-python实现的简单窗口倒计时界面实例
  11. python如何实现飞机上下移动_飞机大战正确方法,利用Python开发一个全自动版来实现自动打飞机...
  12. 数字电路为什么是低电平有效的多
  13. 2019 全年中国马拉松赛事日历表
  14. java校内报纸实验报告_第六周Java实验报告四
  15. WPF与3D 模型(一)把Solidworks里的模型导入进WPF程序
  16. PHP取出数组中随机一条字符串
  17. 【长按图片识别】uniapp vue开发时,点击图片识别—实现转发、收藏、识别图片二维码
  18. like to do 和like doing的区别
  19. 取模后的余数,向负无穷方向舍入
  20. 肝了一个月,整理了一万道2020年最新Java面试题,阿里offer有了

热门文章

  1. Access数据库的使用
  2. 第九十九节,JavaScript数据类型
  3. 商品条形码简介(一)
  4. 利用Python通过商品条形码查询商品信息
  5. C语言简易班费管理系统
  6. ArcMap基础:批量删除复合图斑里的小图斑(消除面部件)
  7. android auto 映射百度地图,GitHub - puderty/pudev: 1,百度CarLife映射与高清修改,纯属自用。2,Android Auto的第三方地图...
  8. 两个PDF比较标出差异_苹果设备上对于网页存储为 PDF 的一些探索
  9. Nginx服务之监控模块vts
  10. 使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别