MySQL中一条SQL到底是如何执行的

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wangchengming1/article/details/99112289

能够清楚的弄明白SQL的执行过程,知道每一个阶段做了什么事情,对于SQL调优是很有必要和帮助的。

MySQL执行一个查询的过程

在这里插入图片描述
图片来源于《高性能MySQL》pdf版。从图片中可以清楚的看到:

  • 客户端发送一条查询给服务器;
  • 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段;
  • 服务器段进行SQL解析、预处理,在优化器生成对应的执行计划;
  • mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询;
  • 将结果返回给客户端。
连接器

负责与客户端建立连接、获取权限、位置和管理连接。主要是TCP握手认证你的身份获取权限这三个环节。

查询缓存

在解析一个查询语句之前,如果查询缓存是打开的,那么mysql会优先检查这个查询是否命中查询缓存中的数据。MySql 在执行查询时会先对查询缓存进行查询,是否之前执行过此查询,之前执行过的语句会以key-value形式,被直接缓存在内存当中key为语句,value是查询结果,查询后2种结果:

  1. 查询缓存命中:直接返回结果(效率很高)
  2. 查询缓存未命中: 继续直行后面的阶段,执行完成后,执行结果会被存入查询缓存中
分析器

如果没有命中查询缓存,就要开始真正执行语句了。首先 Mysql 需要 知道你要执行什么,所以要对sql语句做解析

  • 词法分析
    • 你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”
  • 语法分析
    • 根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这SQL语句是否满足 MySQL 语法。如果你的语句不对,就会收到“You have an erroin your SQL syntax”的错误提醒。这个错误往往在我们写SQL出错的时候出现过,是不是很眼熟,哈哈哈。
优化器

经过分析器之后,MySQL就知道你需要做什么,在执行之前还要经过优化器的处理。当语法树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的链接顺序等等。

执行器

MySQL不会生成查询字节码来执行查询,MySQL生成查询的一棵指令树,然后通过存储引擎执行完成这棵指令树并返回结果。最终的执行计划包含了重构查询的全部信息。

执行语句需要:

  • 判断你是否有查询权限有就继续执行没有就返回权限错误
  • 执行器根据表的引擎定义去掉用引擎接口(例:InnoDB)
    • 无索引:
      调用innoDB引擎接口取出这个表的第一行,判断ID是否等于1,如果不是则跳过,如果是则将这行存在结果集中;调用引擎接口取 ‘下一行’ 执行相同判断逻辑,直到取到表的最后一行
      执行器将所有满足条件的行 组成的记录作为结果集返回给客户端
    • 有索引
      与无索引逻辑差不多,第一次调用的是“取满足条件的第一行”这个接口,之后循环的是“满足条件的下一行”这个几口,接口在引擎中已经定义好。

猜你喜欢

转载自blog.csdn.net/wangchengming1/article/details/99112289