原创

sql语句到底是如何执行的,看这里

前言

在谈论sql语句是如何执行的之前,我们先来看一下下面这几个问题:

1、mysql框架有几个组件,都有什么作用

2、mysql框架中的server层和存储引擎层各是什么作用

3、you have an error in your SQL syntax这个报错是在哪个阶段抛出的

4、对于表的操作权限验证是在哪里进行的

5、执行器的执行查询语句的流程是什么

带着这几个问题我们开始本片文章。

MySQL的架构

当我们执行这样一条sql语句的时候,

select articleTitle from b3_solo_article where oId=1577502208782;有没有考虑过在mysql的内部具体的执行过程是什么。

下面我们先给出mysql的架构示意图,然后再逐步进行解释。
file

总来来说MySQL可以分为两层分别是server层和存储引擎层

server层

server层也就是从连接器到执行器的部分,包括连接器、查询缓存、分析器、优化器、执行器,囊括了大多数mysql的核心功能,server层还包括所有的内置函数,比如日期、时间、数据等,所有跨存储引擎的功能都在server层实现,比如存储过程、触发器、视图等。

连接器

当客户端执行 mysql -u root -p命令时,就会和mysql的服务端进行连接,这个连接的处理都是有server层的连接器进行的。

连接器主要负责和客户端简历连接、获取权限、维持和管理连接。当客户端和服务端进行连接的时候,会先进行TCP握手,再然后就会对你输入的用户名和密码进行校验了:

1、如果用户名或密码输入的不对,就会抛出Access denied for user的错误

2、用户名和密码验证通过后,连接器就会查询这个用户下的所有的权限,之后的权限逻辑判断都是基于此查出的权限进行的,也就是说,如果之后对权限进行了修改,在当前的连接中是不会生效的,必须断开连接重新连接才会生效。

如果建立了连接没有进一步的操作,这个连接就会进入空闲状态,直到超过8个小时,连接器就会主动将这个连接断开。

  • 查询缓存

连接建立完成后,在执行查询语句的时候,在mysql 8.0一下版本会先去缓存中进行查看,看看之前有没有执行过这条语句,如果有会直接返回将之前查到的结果返回。但是这里也是会有问题的,对于一张频繁更新的表,如果有这种查询缓存的命中率非常的低。

因为在执行更新操作到的时候,这个表上的所有的查询缓存都会被清空,刚存下来就被清空,查询缓存就没有任何意义了,还会浪费时间。所以在8.0以后的版本将这个功能去除了,而且现在做缓存也不用mysql,有更好的选择比如redis、MC这些。

分析器

分析器的作用就是通过解析sql来了解要做什么,主要分为一下几步:

  • 词法分析

分析器会先进行词法分析,进行词法分析自然要用到词法分析器,mysql实现了自己的词法分析器,具体是个什么这里就不提了,大家有兴趣可以自己查资料看看。词法分析的本质就是正则匹配的过程,他会识别我们输入的每个字符串是什么,比如select,表明这是一个查询的语句,把表名、列名对应字段都会一一识别出来。如果写的表名或者字段名错了,那就是在这个阶段抛出错误。

  • 语法分析

在进行词法分析之后,就要进行语法分析了,根据词法分析的结果,会判断输入的这个sql语句是否满足mysql的语法,如果不对就会抛出“You have an error in your SQL syntax”的错误提醒。

语法分析是检查 SQL 拼写和语法是否正确,语义检查是检查 SQL 中的访问对象是否存在,语法检查和语义检查可以保证 SQL 语句没有错误,最终得到一棵语法分析树,然后经过查询优化器得到查询计划,最后交给执行器进行执行

优化器

优化器执行阶段可以分为逻辑优化和物理优化,

  • 逻辑优化

逻辑优化通过改变 SQL 语句的内容来使得 SQL 查询更高效,同时为物理查询优化提供更多的候选执行计划。通常采用的方式是对 SQL 语句进行等价变换,对查询进行重写,而查询重写的数学基础就是关系代数。对条件表达式进行等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。

  • 物理优化

逻辑查询优化是基于关系代数进行的查询重写,而关系代数的每一步都对应着物理计算,这些物理计算往往存在多种算法,因此需要计算各种物理路径的代价,从中选择代价最小的作为执行计划。在这个阶段里,对于单表和多表连接的操作,需要高效地使用索引,提升查询效率

查询优化器的目的就是生成最佳的执行计划,而生成最佳执行计划的策略通常有两种方式:基于规则的优化器(RBO,Rule-Based Optimizer)和基于代价的优化器(CBO,Cost-Based Optimizer),关于这两种优化器的工作模式就不深入说明了,还是老规矩,自己查吧,大兄弟,后面有时间再说。

经过优化器会得到查询计划,最后交给执行器进行执行。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

执行器在开始执行的时候,会先进行权限检查,如果没有权限就会返回一个错误,如果有权限就会打开表继续执行。

打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

正文到此结束
本文目录