一条update语句是如何执行的
- 首先连接器要先连接数据库
- 执行update语句会导致查询缓存失效,mysql8.0已经没有缓存功能了。
- 分析器通过语法和词法解析知道这是一条更新语句
- 优化器会决定选择哪个索引
- 执行器负责具体执行,找到这一行,然后更新。
- 更新流程还涉及两个重要的日志模块,redo log(重做日志)和binlog(归档日志)
redo Log(重做日志)
当有一条记录要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在系统空闲的时候,将这个操作记录更新到磁盘。(补充:InnoDB引擎会先把记录写到redo log, redo log在哪,也在磁盘上。但是与更新过程不一样的是,更新过程是在磁盘上随机IO,费时,他是在磁盘上顺序IO,效率要高。)
binlog(归档日志)
binlog是service层的日志,redo log是InnoDB引擎的日志
-
为什么会有两份日志?
因为最开始Mysql里面并没有InnoDB引擎。Mysql自带的引擎是MyISAM,MyISAM没有crash-safe 能力。binlog只作为归档日志。而InnoDB是另一家公司以插件形式引入的,既然MyISAM没有crash-safe能力,那InnoDB就用自带的redo log日志。
执行器具体执行步骤
例:update T set c = c+1 where ID =2; 1、执行器先找InnoDB引擎找id=2的这一页,因为id是主键,所以InnoDB引擎根据树查询到这一行,如果这一行在数据页内,那么找到就返回。如果不在数据页内,那么从磁盘上找到后,返回给执行器。 2、执行器拿到InnoDB引擎的查询数据,执行计算后,给到InnoDB引擎 3、InnoDB引擎拿到执行器的执行结果后,更新内存,写入redo log,此时redo log处于prepare阶段,InnoDB引擎告诉执行器,可以随时提交事务了 4、执行器写binlog日志,并把binlog写入磁盘 5、执行器调用InnoDB引擎的提交事务接口,InnoDB引擎将redo log改为commit阶段,更新完成。