一、Server层阶段:

  1. 连接器:负责跟客户端建立连接、获取权限、维持和管理连接

  2. 分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等。

  3. 优化器:选择索引,生成执行计划。

  4. 执行器:根据优化器生成的执行计划,调用存储引擎API执行SQL。

二、InnoDB引擎层阶段:

  1. 事务执行阶段:

进入InnoDB后引擎层,首先会判断该SQL涉及到的页是否存在于缓存中,如果不存在则从磁盘读取该行记录所在的数据页并加载到BP缓冲池。

假设不存在,然后通过 B+Tree 读取到磁盘的索引页加载到BP缓冲池中 ,如何加载到BP缓冲池中:

首先 通过 space id 和 page no 哈希计算之后把 索引页加载到指定的 buffer pool instance 中

判断 free list 是否有空闲页可用(Innodb_buffer_pool_pages_free、 Innodb_buffer_pool_wait_free),没有则淘汰脏页或者lru list的Old页

把数据页 copy到 free list中,然后加载到 lru list的 old区的 midpoint(头部);

通过二分法查找该页对应的记录,试图给这个SQL涉及到的行记录加上排他锁,过程如下:

如果事务当前记录的行锁被其他事务占用的话,就需要进入锁等待;

进入锁等待之后,同时判断会不会由于自己的加入导致了死锁;

检测到没有锁等待和不会造成死锁之后,行记录加上排他锁。

写逻辑的undo:

将修改前的记录写入undo中

修改当前行的值,填写事务编号,使用回滚指针指向undo log中的修改前的行

从而构建回滚段,用于回滚数据和实现MVCC的多版本

写redo log buffer:

先判断redo log buffer是否够用,redo log buffer不够用就等待,体现在状态值 Innodb_log_waits 上;

在 BP缓冲池 的 Lru list中old区的midpont中对该数据页的行记录的字段值做更新操作,并把修改之后的字段值写入到redo log buffer中

并给LSN加上当前redo log写入的长度(写入长度为 length 的redo log,LSN就会加上 length)

(因为redo group commit的原因,这次事务所产生的redo log buffer可能会跟随其它事务一同flush并且sync到磁盘上)

字段值在BP缓冲池更新成功以后,对应的数据页就是脏页了

写binlog cache:

同时修改的信息,会按照event的格式,记录到binlog_cache中。

写change buffer:

之后把这条sql, 需要在二级索引上做的修改,写入到change buffer page,等到下次有其他sql需要读取该二级索引时,再去与二级索引做merge

(随机I/O变为顺序I/O,但是由于现在的磁盘都是SSD,所以对于寻址来说,随机I/O和顺序I/O差距不大)

事务commit or rollback:

此时update语句已经完成,需要commit或者rollback。这里讨论双1即sync_binlog=1 和 innodb_flush_log_at_trx_commit=1;

  1. 假设事务COMMIT

2.1. 事务的COMMIT 分为prepare阶段与commit阶段

事务的COMMIT操作,在存储引擎层与server层之间采用的是内部XA;

两阶段提交协议, 保证两个事务的一致性,这里主要保证redo log和binlog的原子性;

2.2. redo log prepare:

写入 redo log处于prepare状态 并且写入事务的xid;

将 redo log buffer 刷新到 redo log磁盘文件中,用于崩溃恢复; #刷盘的方式由 innodb_flush_log_at_trx_commit 决定

2.3. binlog write&fsync: 执行器把 binlog cache 里的完整事务和 redo log prepare中的XID 写入到 binlog 中

dump线程会从binlog_cache里把event主动发送给slave的I/O线程,同时执行 fsync刷盘(大事务的话这步非常耗时),并清空 binlog cache。

#事务中写 binlog 的部分日志:

190511 11:06:54 server id 123306 end_log_pos 439 CRC32 0x1c809de0 Xid = 614

COMMIT/!/;

binlog刷盘的方式由 sync_binlog 决定;binlog写入完成,事务就算是成功。

事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog file 中。当sync_binlog为1时,当binlog落盘以后才会通知dump thread进行主从复制

2.3. redo log commit: commit阶段,由于之前该事务产生的redo log已经sync到磁盘了。所以这步只是在redo log里标记commit,说明事务提交成功。

2.4. 事务提交成功,释放行记录持有的排他锁;

2.5. 当binlog和redo log都已经落盘以后,如果触发了刷新脏页的操作:

先把该脏页复制到doublewrite buffer里,其次把doublewrite buffer里的刷新到共享表空间(ibdata),然后才是把脏页写入到磁盘中;

这时候内存页与磁盘的数据页一致。

  1. 假设事务ROLLBACK

如果事务因为异常或者被显式的回滚了,那么所有数据变更都要改回去。这里就要借助回滚日志中的数据来进行恢复了。

对于in-place(原地)更新,将数据回滚到最老版本;

对于delete+insert方式进行的,标记删除的记录清理删除标记,同时把插入的聚集索引和二级索引记录也会被直接删除。

三、至此,一条update SQL在MySQL中结束生命历程

mysql中一条update的执行过程相关推荐

  1. InnoDB:一条update语句执行过程

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

  2. mysql 中 sql 查询语句的执行过程 (mysql基本架构)

    mysql总体上分为server层和存储引擎层 server层负包括连接器.缓存.解析器.优化器.执行器 存储引擎层则负责存储数据 连接器 连接器负责跟客户端建立连接.获取权限.维持和管理连接. 它首 ...

  3. 【MySQL专题】MySQL中一条SQL是如何被执行的?---来自于令狐的独孤九剑

    [MySQL专题]MySQL中一条SQL是如何被执行的? 前言 ​ 大家好,我是令狐,欢迎来到令狐的独孤九剑**[MySQL专题]**这节课跟大家聊一聊MySQL中一条SQL是如何被执行的. MySQ ...

  4. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  5. 大学计算机一条指令的执行过程实验,实验四 一条指令的执行过程

    <实验四 一条指令的执行过程>由会员分享,可在线阅读,更多相关<实验四 一条指令的执行过程(2页珍藏版)>请在人人文库网上搜索. 1.实验四 一条指令的执行过程学号:11201 ...

  6. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  7. 大学计算机一条指令的执行过程实验,实验4 一条指令的执行过程 实验报告(4页)-原创力文档...

    实验4??一条指令的执行过程??实验报告 学号????????????姓名??????????? ???????班级:??? ?????????实验时间:? ????年??月??日? ? 实验报告表4 ...

  8. 瞎说系列——Mysql update的执行过程

    要了解mysql update语句的执行过程,首先要了解一下mysql是如何进行数据的操作的. 首先,数据库中的数据存在哪?肯定是文件系统,磁盘上对吧.那么思考一下,每次查询都从磁盘上去查找吗? 答案 ...

  9. sql server修改字段编码格式_原理:一条 sql 的执行过程详解

    思维导航: 写操作执行过程 组件介绍 1.undo log 与 MVCC 2.redo log 与 Buffer Pool 3.bin log(Server 层) 1.连接器 2.缓存(Cache) ...

最新文章

  1. java初始化实例化_Java对象的创建过程:类的初始化与实例化
  2. Android实现左右滑动效果
  3. solaris下ftp配置说明
  4. Spring Cloud Feign的文件上传实现
  5. JAXB在Java 9/10并且使用Tomcat 9的问题
  6. Linux的硬盘分区
  7. 计算机相关冷门专业,211名校冷门专业和双非计算机专业,该如何选择?过来人告诉你...
  8. 循环嵌套-使用字符串运算直接输出小星星
  9. asp.net 写入html代码,asp.net读取模版并写入文本文件
  10. java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型
  11. 关于栈的链式存储结构
  12. [原创]个人工具 - 对APK极限压缩并对齐的工具(58.ReExtremeZipAndAlignAPK)
  13. python写我爱你_12个精选Python教程我的初恋故事。
  14. 【java】java 线程状态之 TIMED_WAITING
  15. Cesium源码剖析---Post Processing之物体描边(Silhouette)
  16. 图形界面下,如何查看LINUX隐藏的文件、目录
  17. ASP程序部署在IIS上的步骤
  18. 点云 数据 (偏向于研究大小)
  19. Linux:telnet命令安装
  20. 在华为外包的工作体验

热门文章

  1. 金蝶 EAS BOS F7过滤
  2. 《CSS禅意花园》读后感
  3. 如何配置Linux系统的IP地址?
  4. Linux下cp命令
  5. 关闭Windows Defender实时保护解决下载激活软件报检测到病毒无法下载的问题
  6. 【洛谷P6199 [EER1]河童重工】【点分治+虚树】
  7. win10升级工具_Win7进入死亡倒计时!最后一次机会免费升级至win10,你抓住了吗?...
  8. 【华为OD机试真题 JS】德州扑克
  9. 安装pr说找不到adobe服务器,Adobe 安装错误代码对照表及解决方案
  10. 计算机与MCU通信及MAX232、CH340T与PL2303的区别