最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

朋友百度面试:一条SQL查询语句是如何执行的?

XAMPP相关 admin 377浏览 0评论
之前有朋友百度面试有问到:一条SQL查询语句是如何执行的?
就该同学的问题想和大家聊聊MySQL的基础架构,理解了MySQL的基础架构,你便知道了一条SQL查询语句底层究竟是怎样执行的啦!平时我们使用数据库,看到的通常都是一个整体。例如我们随便执行一条SQL语句,我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在MySQL内部的执行过程。今天,想把MySQL拆解一下,看看它究竟有哪些东西。 

01
MySQL的逻辑架构

 

下面是MySQL的基本架构示意图,从中可以清楚地看到SQL语句在MySQL的各个功能模块中的执行过程。

dre085

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

Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能。比如,内置函数、存储过程、视图、触发器等

而存储引擎层负责数据的存储和提取。它是插件式的,可以支持不同的存储引擎,比如:InnoDB、MyISAM、Memory。

现在我们知道MySQL的基础架构构造,那具体每个部分是怎样的呢?

 

02
连接器
我们使用数据库,第一步是连接到数据库。而连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接执行命令:

mysql -h$ip -P$port -u$user -p
在mysql客户端工具输入连接命令,用来跟服务端建立连接。在完成经典的TCP握手后,连接器便负责进行身份认证,权限认证。

03
查询缓存

连接建立完成后,便可以执行select语句啦。然后执行逻辑就会来到第二步:查询缓存。

MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。

key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。

如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

可以看出,如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

但是,大多数情况不建议开启缓存,因为更新就会导致缓存失效,若频繁更新,维护缓存反而浪费时间。

注意:MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。

 

04
分析器

若没有命中缓存,便需要真正执行SQL语句啦。执行之前,MySQL肯定需要知道你要做啥,因此,来到了分析器对SQL进行解析(词法分析、语法分析)。

具体底层是怎样实现分析的我们不需要过多了解,我们又不是DBA。不过可以大概理解为:先进行词法分析,把关键字识别出来,再进行语法分析,看你的SQL语句语法是否有错。

 

05
优化器

通过分析器,我们知道了SQL需要做什么,但是直接根据SQL去获得结果可能会消耗很大性能,因此还得需要经过优化器对其进行优化。

 

优化器做些什么呢?

  1. 表里面有多个索引的时候,决定使用哪个索引。(不过有时索引可能选错)
  2. 一个语句有多表关联(join)的时候,决定各个表的连接顺序(不同方案逻辑结果一致,但耗时不同)

 

06
执行器

 

优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段啦。

通过了解进行了身份认证,验证了你可以进来操作;有通过分析器知道了你需要干什么;然后经过优化器得到了优化器认为的最优方案(有时不一定最优);最后便需要执行器来执行SQL语句啦。

具体怎样执行就大概介绍一下,想要更清楚了解,感兴趣可以自己去看书。

 

mysql> select * from T where ID=10;

ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'
比如我们这个例子中的表T中,ID字段没有索引,那么执行器的执行流程是这样的:

  1. 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。

 

总结:

mysql的架构(一条sql查询语句执行过程)

mysql分为server层与存储引擎层,server层包含连接器、分析器、优化器、执行器接下来以一条sql查询语句执行过程介绍各个部分功能。客户端执行一条sql:1、首先由连接器进行身份验证,权限管理2、若开启了缓存,会检查缓存是否有该sql对应结果(缓存存储形式key-vlaue,key是执行的sql,value是对应的值)若开启缓存又有该sql的映射,将结果直接返回;

3、分析器进行词法语法分析

4、优化器会生成执行计划、选择索引等操作,选取最优执行方案

5、然后来到执行器,打开表调用存储引擎接口,逐行判断是否满足查询条件,满足放到结果集,最终返回给客户端;若用到索引,筛选行也会根据索引筛选。

 

只是一起走过一段路而已,何必把怀念弄得比经过还长。——火柴盒

转载请注明:XAMPP中文组官网 » 朋友百度面试:一条SQL查询语句是如何执行的?

您必须 登录 才能发表评论!