简单记一条查询SQL语句的执行全过程

目录

 

MySQL基本架构图示意图(盗的)

本文章分析的SQL语句如下,id是主键索引

下面进入主题,SQL执行过程分析


MySQL基本架构图示意图(盗的)

大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

本文章分析的SQL语句如下,id是主键索引

select * from t where id=10;

下面进入主题,SQL执行过程分析

1、连接器负责跟客户端建立连接、获取权限、维持和管理连接

  1. 数据库用户名密码权限验证,验证失败则提示:Access denied for user
  2. 验证通过,连接器会到权限表查出用户拥有所有权限并记录,执行器阶段会使用
  3. 进入步骤2
  4. 后面是连接器的维护和管理

2、判断缓存是否开启,开启则进入步骤3,否则进入步骤4

3、检查SQL是否命中缓存,命中直接返回结果否则进入步骤4

这里提一下,这里查询的key是此次查询的SQL语句,value是SQL上次查询的结果集。

即:key="select * from t where ID=10",value="上次进行此SQL查询的结果集合"

4、分析器开始对SQL进行词法分析,语法分析,语义分析

1)、词法分析目的:需要识别出SQL里面的字符串分别是什么,代表什么?

例如针对此SQL,需要词法分析的过程是:

  1. MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。
  2. 它也要把 字符串“t” 识别成 "表名 t"
  3. 把 字符串"id" 识别成 "列 id"

2)、语法分析目的:判断SQL 语句是否满足 MySQL 语法

例如针对此SQL,语法分析的过程是:分析 “select"、"from"、”where" 是否符合语法。

注:如果将 "select"打成"slect",那么在这个阶段会抛出错误:You have an error in your SQL syntax; 

3)、语义分析:对SQL中的表,字段属性等内容进行检查是否存在

例如针对此SQL,语义分析的过程是:检查表 “t” 是否存在,列 “id” 是否存在。

注:如果数据库不存在列“id”,会抛出列不存在的错误,就是分析器在语义分析阶段抛出的。

分析器结束后,进入步骤5

5、优化器主要进行执行方案选择和索引策略选择

当有多种索引、有多种执行方案可以执行时,优化器就会去考虑选择走什么索引(或者不走索引),走哪种执行方案,效率会更高。总的来说:优化SQL语句的执行,最终生成执行计划

对于此SQL,优化器决定使用id这个索引后进入步骤6

6、执行器进行语句执行,调用引擎层接口获取记录集并返回给客户端

分析器知道了你要做什么,通过优化器知道了该怎么做,执行器就开始执行,下面是过程:

  1. 判断用户 ”对表t“ 有没有查询权限(刚开始建立连接已经查出所有权限),没有权限报错,有则进入下一步
  2. 有权限就会打开表继续执行,执行器会根据表的引擎定义,去使用这个引擎提供的接口,这里是索引提供的接口
  3. 调用 InnoDB 引擎接口,判断第一行 id 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中
  4. 调用引擎接口取 “下一行”,重复相同的判断逻辑,直到取到最后一行
  5. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

至此,这条SQL语句“select * from t where id=10”就执行完成了!

猜你喜欢

转载自blog.csdn.net/qq_41055045/article/details/108375952