一条SQL查询语句是如何执行的


MySQL数据库的架构

MySQL 包含 Server 层和存储引擎层两大部分。

存储引擎层

负责数据的存储和提取,MySQL 采用插件式的存储引擎,常见的存储引擎有

  • InnoDB
  • MyISAM
  • CSV

其中 InnoDB 是最常用的存储引擎,也是 MySQL 的默认存储引擎

Server 层

  • 连接池: 用来身份认证和权限验证
  • 查询缓存: 执行查询语句的时候,会先查询缓存,命中缓存之间返回
  • 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,检查你的 SQL 语句语法是否正确,分析你的 SQL 语句要干什么
  • 优化器: 优化成最优的执行方案去执行
  • 执行器: 执行优化后的语句,然后从存储引擎返回数据

在这里插入图片描述

连接器

  • 连接器主要和身份认证和权限相关的功能相关,类似哨兵
  • 主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作

查询缓存

MySQL 查询不建议使用缓存,因为查询缓存经常失效,所以大多数情况下都是不去使用查询缓存的。

  • 查询缓存主要用来缓存我们所执行的 SELECT 语句以及该语句的结果
  • 连接建立后,执行查询语句的时候,会先查询缓存,如果缓存 key 被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作
  • 查询完成后也会把结果缓存起来,方便下一次调用
  • 真正执行缓存查询的时候还是会校验用户的权限,判断该用户是否有查询权限

分析器

如果 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干什么的,分为两步

  • 词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等

  • 语法分析,主要就是判断你输入的 sql 是否正确,是否符合 MySQL 的语法

优化器

  • 优化器的作用就是它认为的最优的执行方案去执行
  • 例如如多个索引的时候该如何选择索引
  • 经过了优化器之后就可以让执行器去执行sql了

执行器

  • 首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息
  • 如果有权限,就会去调用引擎的接口,返回接口执行的结果。

一条查询语句如何执行

select name from student  where  age= '18' and sex = '女'

我们分析下这个语句的执行流程:

  1. 先检查该语句是否有权限,如果没有权限,直接返回错误信息

  2. 如果有权限,在 MySQL8.0 版本以前,会先查询缓存,如果命中缓存之,间返回,如果没有,执行下一步。

  3. 通过分析器进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select,提取需要查询的表名为 student,需要查询名为name的列,查询条件是这个表的 age=’18’和sex=‘女’。

  4. 判断这个 sql 语句是否有语法错误,比如关键词是否正确等等,如果错误就执行下一步。

  5. 接下来就是优化器进行确定执行方案,上面的 sql 语句,可以有两种执行方案,优化器会根据自己的优化算法选择执行效率最好的一个方案

    • 先查询学生表中age为“18”的学生,然后判断是否sex=女。
    • 先找出学生中sex=女的学生,然后再判断是否age=18
  6. 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果给客户端

    总结

    权限校验—>查询缓存—>分析器—>优化器—>权限校验—>执行器—>执行引擎
    在这里插入图片描述


Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC