update tb_student A set A.age='19' where A.name=' 张三 ';
这条 SQL 语句,MySQL 的执行流程可以分为如下几个步骤:
- 客户端/服务器通信
- 查询解析和预处理
- 查询优化器生成执行计划
- 开始事务(如果使用事务)
- 查询执行
- 记录
binlog
(事务提交前写入binlog
) - 两阶段提交(确保
binlog
和redo log
一致) - 事务提交
- 返回结果
流程说明:
-
客户端/服务器通信
用户在客户端发出
UPDATE tb_student SET age='19' WHERE name='张三';
语句。 -
查询解析和预处理
MySQL 解析 SQL 语句,并检查表和列是否存在,用户权限是否足够,SQL 语法是否正确。
-
查询优化器生成执行计划
MySQL 优化器生成执行计划,决定如何最快地找到
name='张三'
并更新age
字段。 -
开始事务(如果使用事务)
当事务开始时,InnoDB 存储引擎会记录
undo log
,以备事务回滚使用。这时候数据在内存中更新,但尚未对外生效。 -
查询执行
根据执行计划,MySQL 从表中找到
name='张三'
的记录,并将age
更新为19
。此时,更新只是在内存中进行,并且修改的旧数据会被写入undo log
。 -
记录
binlog
(在事务提交前)这是
binlog
记录的关键步骤。在事务准备提交时,MySQL 会按照以下步骤处理:- 生成
binlog
条目 :对于UPDATE
语句,MySQL 会生成该语句的binlog
记录。如果使用row-based
方式记录binlog
,则会记录受影响行的旧值和新值。如果是statement-based
方式,MySQL 则会记录 SQL 语句本身。 - 写入
binlog
:MySQL 将生成的binlog
条目写入到二进制日志文件中,但此时事务尚未正式提交,处于准备提交状态。
- 生成
-
两阶段提交
MySQL 使用两阶段提交来确保
binlog
和存储引擎的redo log
保持一致,以避免在崩溃恢复时出现数据不一致的问题。两阶段提交过程如下:- 第一阶段:写入
binlog
:首先,MySQL 会将生成的binlog
记录持久化到磁盘中。 - 第二阶段:写入
redo log
并提交事务 :接着,MySQL 将redo log
写入存储引擎,并提交事务。在redo log
和binlog
都成功写入磁盘后,事务才被认为正式提交。
- 第一阶段:写入
-
事务提交
MySQL 在完成两阶段提交后,事务会正式提交。事务提交后,内存中的数据修改生效,InnoDB 也会更新数据页,并在适当时候将修改后的数据页写回到磁盘。
-
返回结果
最终,MySQL 向客户端返回成功信息,表示更新操作已成功完成,并且
binlog
中记录了该更新。
binlog
的作用:
- 数据恢复 :在崩溃恢复时,
binlog
记录的 SQL 操作可以帮助将系统恢复到崩溃前的状态。 - 主从复制 :在主从复制场景中,
binlog
被用于将主库上的数据修改同步到从库上。