一天一道面试题——数据库篇2(SQL语句执行流程)

2022-02-17  本文已影响0人  猿哥媛姐

说一说一条SQL语句在MySQL中的执行流程。

组件

查询语句

执行过程:

更新语句 (update语句)

执行过程:

redo log 两阶段提交

最开始 MySQL 并没与 InnoDB 引擎( InnoDB 引擎是其他公司以插件形式插入 MySQL 的) ,MySQL 自带的引擎是 MyISAM,但是我们知道 redo log 是 InnoDB 引擎特有的,其他存储引擎都没有,这就导致会没有 crash-safe 的能力(crash-safe 的能力即使数据库发生异常重启,之前提交的记录都不会丢失),binlog 日志只能用来归档。

先写 redo log 后写 binlog。假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行。但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行,与原库的值不同。
先写 binlog 后写 redo log。如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,但是 binlog 里面已经记录了修改这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,,与原库的值不同。

崩溃恢复

总结

查询类

权限校验—>查询缓存—>分析器—>优化器—>权限校验—>执行器—>引擎

更新类

权限校验—>分析器—>优化器—>权限校验—>执行器—>引擎,InnoDB采用两次写的方式

上一篇下一篇

猜你喜欢

热点阅读