InnoDB:一条update语句执行过程
存储引擎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语句执行过程相关推荐
- mysql中一条update的执行过程
一.Server层阶段: 连接器:负责跟客户端建立连接.获取权限.维持和管理连接 分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等. 优化器:选择索引,生成执行计划. 执行器:根据优 ...
- mysql执行两条update语句
执行两条update语句,没有join关联时 update dp_auto_group_price dagp ,dp_auto_group dag set dagp.is_pub = 0 ,dag.s ...
- mysql update from 语句_MySQL高频面试题01期:一条update语句的生命历程
在有关 MySQL 的面试时,是不是曾经有被问到过:一条 update 语句的生命历程是怎样的?今天就来聊聊这一面试题. 这篇文章通过这条语句进行讲解: update test set a=5 whe ...
- MySQL语句执行过程
目录 前言 MySQL语句执行过程 一.连接器 二.查询缓存 三.分析器 四.优化器 1.逻辑查询优化 1.1 逻辑查询优化思路. 2.2 查询重写规则 2.3 启发式规则再逻辑优化阶段的应用 2.3 ...
- MySQL——update 语句执行流程
图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁: 把更新行记录的旧值写入 undo log(以便回滚): ...
- 一条 update 语句的生命历程
在有关 MySQL 的面试时,是不是曾经有被问到过:一条 update 语句的生命历程是怎样的?今天就来聊聊这一面试题. 这篇文章通过这条语句进行讲解: update test set a=5 whe ...
- mysql 查询语句执行顺序_MySQL 查询语句执行过程
MySQL 查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注的是, ...
- mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解
昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化. 当希望MySQL能够以更高的性能运行查 ...
- mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程
mysql基础架构 示意图 首先 mysql 大概分为 server层 和 存储引擎层 两个部分, 引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB.MyISAM.Memory 等 ...
最新文章
- R语言gc函数垃圾回收实战
- 二叉树的遍历(包括递归和非递归方法)
- 计算机学院 拔河比赛加油词,运动会拔河比赛加油词
- 愤怒的小鸟【$DP$优化】
- java mysql连接两张表,如何使用Java和MySQL在一个语句中插入两个不同的表?
- mysql 批量远程_【shell--批量远程MySQL,执行命令】-【工作总结】
- 20应用统计考研复试要点(part26)--简答题
- python里随机抽取样本_概率分布和抽样分布基础知识及Python实现
- UNIX环境高级编程——pthread_create的问题
- python简单程序实例-python实现的简单窗口倒计时界面实例
- python如何实现飞机上下移动_飞机大战正确方法,利用Python开发一个全自动版来实现自动打飞机...
- 数字电路为什么是低电平有效的多
- 2019 全年中国马拉松赛事日历表
- java校内报纸实验报告_第六周Java实验报告四
- WPF与3D 模型(一)把Solidworks里的模型导入进WPF程序
- PHP取出数组中随机一条字符串
- 【长按图片识别】uniapp vue开发时,点击图片识别—实现转发、收藏、识别图片二维码
- like to do 和like doing的区别
- 取模后的余数,向负无穷方向舍入
- 肝了一个月,整理了一万道2020年最新Java面试题,阿里offer有了
热门文章
- Access数据库的使用
- 第九十九节,JavaScript数据类型
- 商品条形码简介(一)
- 利用Python通过商品条形码查询商品信息
- C语言简易班费管理系统
- ArcMap基础:批量删除复合图斑里的小图斑(消除面部件)
- android auto 映射百度地图,GitHub - puderty/pudev: 1,百度CarLife映射与高清修改,纯属自用。2,Android Auto的第三方地图...
- 两个PDF比较标出差异_苹果设备上对于网页存储为 PDF 的一些探索
- Nginx服务之监控模块vts
- 使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别