程序员

一条SQL语句的执行过程

2020-11-01  本文已影响0人  CODE_WEN

    笔者在之前的一次面试过程中就遇到了这个问题,当时说得也不是很明白,今天写一个博客记录一下。
    本博客将会从两部分说明,第一部分是MySQL的一些基本组件,第二部分就是具体sql语句的分析。

一、MySQL的基本组件

简单来说MySQL主要分为两个部分:Server层和存储引擎层

1.Server层基本组件介绍

1)连接器

      连接器主要是和身份认证、权限相关的功能相关。主要负责在用户登陆数据库的时候进行身份认证,包括校验用户账户密码、权限等。当账户密码通过的时候,连接器会到权限列表中读取相应的权限数据,之后在这个连接里的所有权限逻辑判断都会依赖此次读取到的权限数据。只要连接不断开,就算管理员修改了权限,也不会影响查询。

2)查询缓存

      查询缓存主要是用来缓存我们所执行的SELECT语句以及相关的结果集。在建立连接之后,当执行查询语句的时候,会先查询缓存,如果缓存命中,就会直接从缓存中返回给客户端。(就算是从缓存中获取也会在查询缓存的时候先验证权限,是否具有该表的查询权限)
      缓存是以Key-Value的形式放在内存中,Key是查询语句,Value是结果集。如果查询缓存时没有命中,就会执行后续的操作,完成后也会把结果缓存起来。

      注意:查询缓存在MySQL 8.0版本之后被移除

3)分析器

      当没有缓存命中的时候就会进入分析器,分析器分为如下两步:
       1.词法分析:首先提取关键字,查看是哪种操作,比如 SELECT,找出查询的表,查询的字段名,查询条件等。做完这些进入第二步。
       2.语法分析:主要判断SQL有没有语法错误,是不是符合MySQL的语法规则。

4)优化器

       优化器会以它认为最优的执行方案去执行,(有时候也可能不是最优,具体可以看笔者其他文章),比如多个索引时如何选择索引等。

5)执行器

      在确定了执行方案之后,MySQL就开始执行了。第一步就是权限校验,如果没有权限就会返回错误信息,如果有权限的话就会去调用引擎的接口,然后返回接口执行的结果。(包括缓存查询结果)

二、语句分析

       sql语句可以分为两种,一种是查询select,一种是更新(delete,update,insert)。

1.查询语句

SELECT * FROM tb_student S WHERE S.age = 18 AND S.name = 'CODE_WEN';

结合上面的说明,分析上面语句的执行过程:

2.更新语句

UPDATE tb_student A set A.age = 19 where A.name = 'CODE_WEN';

这条语句也会按照上面的流程走,只是在执行操作的时候要记录日志。MySQL自带的日志模块是bin log(归档日志),所有的存储引擎都会使用,InnoDB引擎还自带一个redo log(重做日志)。下面以InnoDB为例。流程如下:

SQL执行过程
查询流程:权限校验 ==> 查询缓存 ==> 分析器 ==> 优化器 ==> 权限校验 ==> 执行器 ==> 引擎
更新流程:权限校验 ==> 查询缓存 ==> 分析器 ==> 权限校验 ==> 执行器 ==> 引擎 , redo log prepare ==> bin log ==> redo log commit

 
 
 

关于 redo log和bin log请看笔者其他相关文章

上一篇 下一篇

猜你喜欢

热点阅读