一条SQL更新语句是如何执行的?

7 阅读2分钟

一条SQL更新语句是如何执行的?

执行过程

  1. 连接器建立连接:客户端与服务器建立TCP/IP连接。
  2. 分析器进行语法分析:确定SQL语句是更新语句。
  3. 优化器:选择使用哪个索引。
  4. 执行器:执行引擎找到具体的数据行,然后进行更新。

除了这几步之外,SQL更新操作还涉及到两个日志文件,redo log重做日志,binlog归档日志。

redo log保障crash-safe。

redo log与binlog

  1. redo log是InnoDB引擎特有的,binlog是server层的。
  2. redo log是物理日志,记录的是“在某个数据页上做了什么修改”,binlog是逻辑日志,记录的是“ID=2的数据行修改name为Bob”。
  3. redo log是循环写,空间是固定的会用完;binlog是可以追加写入的,当一个文件写满了,会切换到下一个。

二阶段提交

为了防止数据更新过程中,数据库发生故障重启之后,之前客户端写入的数据不会丢失,所以出了redo log重做日志。

在数据更新的时候,会先将数据写入到redo log里面,redo log状态变成prepare,然后将修改写入binlog,redo log状态变成commit。

思考

为什么不能直接使用binlog实现故障恢复呢,在每次将数据写入磁盘之前, 先写入binlog,等到空闲的时候,再写入磁盘?

思考这个问题前,应该先明确,故障恢复的核心是什么?故障恢复的数据是没有写入磁盘的数据。

因为,binlog记录的全量日志,无法判断哪些数据写入了磁盘,哪些数据没有写入磁盘,所以故障恢复难以实现。而redo log维护了两个指针,会记录没有写入磁盘的数据,写入磁盘的数据也会进行擦除,所以可以实现crash-safe。