)
前言我上篇文章详细讲解了MySQL中查询语句的执行流程那么这篇文章我将详细讲解MySQL中更新语句的执行流程。我将会以 update T set cc1 where ID 2;这个例子进行详细讲解。一、文字流程1. 先进行查询语句执行流程2. 在存储引擎中查询ID2执行器首先要在存储引擎中查询ID如果存在就直接返回给执行器。如果不存在就需在磁盘中读入内存再返回给执行器。3.判断是否ID存在数据页中如果不存在就需要从磁盘中读入内存之后返回行数据。如果存在就直接返回行数据。拿到行数据之后在这个值1得到新的数据再调入引擎接口写入这行数据。4. 写入redo log处于prepare阶段 重点将新数据更新到内存中记录到redo log 里面此时redo log 处于prepare状态并且引擎告知执行器可以写bin log随时处于提交状态。5. 写bin log 重点执行器生成这个操作的bin log 并写入磁盘。6. 提交事务处于commit状态执行器调用引擎的提交事务接口把redo log改成commit状态。二、注意MySQL更新语句的过程中最重要的是redo log 和bin log。1. redo log是重做日志是属于操作级别的特点是循环写入。一般存在引擎。作用redo log 是循环写入固定大小的文件目的是避免随机磁盘写入提升性能。事务提交时会强制刷盘可配置。2. bin log归档日志是数据同步和恢复数据的作用特点是追加写入。一般处于server层和引擎层。3. redo log vs bin log的区别重点前者是引擎特有的后者是MySQL中server层是西安的所有引擎都可以用。前者是物理日志后者是逻辑日志。前者关心的是数据在磁盘上的物理布局和如何有效的修改数据。后者关心的是执行了哪些操作以及这些操作的内容。前者是循环写入的空间是固定的会用完。后者是可以追加写入的。三、示意图的流程四、补充内容两阶段提交就是示意图中画红色的三个节点就是两阶段提交。为什么需要两阶段提交因为为了防止写完redo logprepare后写bin log之前MySQL崩溃导致回滚。因为为了防止写完bin log 后redo log未commit前崩溃导致恢复时根据bin log和redo log判断是否提交。如果数据也本来就在内存中不会从磁盘读五、总结看完这篇博客是否懂了MySQL更新语句是怎么执行的吗简单来说就是MySQL 更新语句的核心是先更新内存同时记录 redo logprepare再写 bin log最后将 redo log 改为 commit。这种方式称为“两阶段提交”保证了 crash-safe 能力同时支持主从复制和基于时间点的恢复。