从查询语句执行流程看MySQL架构

前言

常言道,看待一个事情要先知全貌,从高维度认识、理解,然后再深入各个细节,一一击破。MySQL的学习也不例外,那么你知道一条SQL在MySQL中执行要经历哪些步骤吗?每个步骤都有MySQL的哪些“零件”参与吗?如果不清楚的话,可以阅读本文。

SQL执行流程

在MySQL客户端或者JAVA应用程序中查询一条最简单的语句比如select * from T where ID =10;你知道经历哪些步骤吗?

连接

你要执行查询语句前肯定要先和MySQL建立连接啊,那怎么建立连接呢?

可以通过下面的命令:

mysql -h ip -P port -u$user -p
复制代码

这个用于连接的“零件”就是MySQL的连接器,它主要负责跟客户端建立连接、获取权限、维持和管理连接。

查缓存

现在连接建立好了,相当于客户端和MySQL服务端的“传输管道”有了,开始查数据了。

都说性能不够,缓存来凑,MySQL“为了性能”,也实现了查询缓存。

所以关键点在于MySQL表的更新频率以及缓存的命中率,我们可以根据下面命令查看监控查询缓存:

show status like '%Qcache%';
复制代码

这上面一个过程就是MySQL的查询缓存操作。

但是实际情况是查询缓存往往弊大于利,因为查询缓存的失效非常频繁,一般建议大家在静态表里使用查询缓存。但是在MySQL 8.0中已经去掉了查询缓存。

分析验证

如果没有命中查询缓存,就要开始真正去查了。在查询前,MySQL肯定要“理解”你这条SQL语句啊,所以要有个“零件”去分析验证你的SQL语句,那究竟是怎么个分析过程呢?

  1. 词法分析, 你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面 的字符串分别是什么,代表什么。
  2. 语法分析,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足 MySQL语法。

这也是为什么我们的SQL语句存在语法问题的时候会报错,就是这个叫做分析器的零件报出来的。

优化

语法没问题,就够了吗?当然不够,智能的MySQL还要帮我们做优化,那都做哪方面的优化呢?

  1. 比如有多个索引的时候,智能选择一个它认为最佳的索引
  2. 多表关联的时候,决定表的连接顺序
  3. 对子查询进行优化
  4. 对连接语义进行了外连接消除、嵌套连接消除....

这个过程就是由MySQL的优化器做的。

执行

优化器阶段完成后,这个语句的执行方案就确定下来了,然后真正的开始执行了。

在执行之前需要判断该用户是否具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。

我们以一开始的查询语句select * from T where ID =10;为例,ID没有索引,并且采用的innoDB作为存储引擎,整体查询的流程如下:

上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户,这一个过程就是由MySQL的执行器执行的。

MySQL逻辑架构

上面讲解了查询语句的真个执行流程,涉及了MySQL的各个“零件”,我们将这些零件组装组装,可以形成下面的逻辑架构图:

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

总结

本文通过以一个查询语句的执行流程为例,讲解了MySQL整体的逻辑架构,对MySQL的各个部分有了一个全局的认知。这样,在遇到问题的时候,也比较有针对性,比如对于一个select * from T where k=1,报了Unknown column ‘k’ in ‘where clause’的错误,我们就很快的知道是分析器报出来的,因为分析器会分析我们SQL的语法。

展开阅读全文

页面更新:2024-03-01

标签:语句   流程   分析器   缓存   零件   语法   架构   客户端   逻辑   权限   引擎

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top