一条update语句是如何被执行的

48 阅读1分钟

假设在我们的test数据库中有一张表t,t包含三个字段,其建表语句如下:

CREATE TABLE `test`.`t` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(10) NOT NULL DEFAULT '名字',
  `age` SMALLINT(3) NOT NULL DEFAULT '年龄',
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_bin;

插入两条数据

INSERT INTO test.t values (1,'张三',18),(2,'李四',19);

如果现在想把张三的年龄+1,需要执行这样的语句:

update t set age = age+1 where name ='张三';

那么这样一条简单的sql执行过程是怎样的呢?

  1. 通过连接器建立连接,进行词法解析、语法解析,权限校验,经过优化器,来到执行器,执行器调用存储引擎接口(这里我们默认是InnoDB存储引擎)。
  2. InnoDB收到Sql后,先查询数据,如果张三这条数据对应的数据页已经在innodb_buffer_pool,直接从内存返回结果,否则从磁盘中将数据页加载到内存中,然后返回数据。
  3. Server层收到结果后,对结果进行+1,然后再调用InnoDB的接口将数据写回。
  4. 先写undo log,然后将新数据写入内存中的数据页中,然后写入内存中的redolog。
  5. 事务提交,redolog prepare阶段、写binlog 、redolog commit阶段。