【MySQL】面试官:你说说一条查询/更新SQL的执行过程?

学习来源:link.

Mysql的三层架构

  1. 第一层作为客户端和服务端的连接,连接器负责处理和客户端的连接,还有一些权限认证之类。比如客户端通用用户名密码连接到Mysql服务器,还有对于数据库表的执行权限。

  2. 第二层是核心层,基本上Mysql大部分的核心功能都在这一层,包括查询缓存、解析器、优化器之类,比如SQL解析、优化、索引选择,到最后生成执行计划。

  3. 第三层则是存储引擎了,Mysql通过执行引擎直接调用存储引擎API查询数据库中数据。

  4. 在这里插入图片描述

一个查询SQL的大概的执行过程。

  1. 首先客户端发送请求到服务端,建立连接。
  2. 服务端先看下查询缓存是否命中,命中就直接返回,否则继续往下执行。
  3. 接着来到解析器,进行语法分析,一些系统关键字校验,校验语法是否合规。
  4. 然后优化器进行SQL优化,比如怎么选择索引之类,然后生成执行计划。
  5. 最后执行引擎调用存储引擎API查询数据,返回结果。
  6. 在这里插入图片描述

一个更新SQL的大概的执行过程。

  1. 首先客户端发送请求到服务端,建立连接。
  2. 服务端先看下查询缓存,对于更新某张表的SQL,该表的所有查询缓存都失效。
  3. 接着来到解析器,进行语法分析,一些系统关键字校验,校验语法是否合规。
  4. 然后优化器进行SQL优化,比如怎么选择索引之类,然后生成执行计划。
  5. 执行引擎去存储引擎查询需要更新的数据。
  6. 存储引擎判断当前缓冲池中是否存在需要更新的数据,存在就直接返回,否则去从磁盘加载数据。
  7. 执行引擎调用存储引擎API去更新数据。
  8. 存储引擎更新数据,同时写入undo_log、redo_log信息。
  9. 执行引擎写binlog,提交事务,流程结束。
    在这里插入图片描述

undolog、redolog、binlog的区别

undolog

回滚日志文件,主要用于事务中执行失败,进行回滚,以及MVCC中对于数据历史版本的查看。

redolog

  1. redo log是InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。

  2. 当数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据,如果这个时候发生非正常的DB服务重启,那么这些数据还没在内存,并没有同步到磁盘文件中(注意,同步到磁盘文件是个随机IO),也就是会发生数据丢失,如果这个时候,能够在有一个文件redolog,当buffer pool 中的data page变更结束后,把相应修改记录记录到这个文件(注意,记录日志是顺序IO),那么当DB服务发生crash的情况,恢复DB的时候,也可以根据这个文件的记录内容,重新应用到磁盘文件,数据保持一致

binlog

  1. binlog是属于MySQL Server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的是这个语句的原始逻辑。
  2. binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
  3. binlog可以作为恢复数据使用,主从复制搭建。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值