01 | 基础架构:一条SQL查询语句是如何执行的?

栏目: 数据库 · 发布时间: 5年前

内容简介:其实一条SQL的查询语句的执行并不是很复杂!我们就从最简单的一条查询语句来入手分析这个问题。 比如一条

其实一条 SQL 的查询语句的执行并不是很复杂!

我们就从最简单的一条查询语句来入手分析这个问题。 比如一条 SELECT * FROM T WHERE ID=10; 这样的语句它的整个执行的流程是怎么样的呢?

01 | 基础架构:一条SQL查询语句是如何执行的?

上图就是 MySQL 的结构图,从结构上我们能看到MySQL的结构主要分为两层:

  • server层 主要包括:连接器、查询缓存、分析器、优化器、执行器等
  • 引擎层 引擎层主要是负责数据的存储和读取

连接器

连接器主要是负责连接MySQL客户端并获取权限以及维持连接状态。我们想要执行MySQL语句之前先要连接MySQL客户端,执行语句:

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

执行上面语句的时候会出现以下两种情况:

ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: NO)

查询缓存

NOTEThe query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0

查询缓存是指输入查询语句,MySQL会优先执行查询缓存,如果命中缓存则直接返回查询结果。在MySQL中对于每次查询的结果会有缓存,每次有对于数据库表结构或者数据的修改,缓存就会失效。如果没有命中缓存就会继续往下执行。 所以在大多数情况下缓存的命中率是很低的,除非是一张更新频率非常低的静态表,否则缓存的命中率会非常的低。MySQL官方也是在MySQL8.0中放弃了对于查询缓存的支持。所以在大多数情况下是不建议使用查询缓存的。 关于查询缓存的配置请参考官方文档操作: Query Cache Configuration

分析器

没有命中缓存,就要开始执行真正的执行语句了。分析器的工作主要是对输入的SQL语句做解析。 首先会做"词法分析",当你输入一窜SQL语句的时候,系统要先能识别T是一个表名,ID是字段名,WHERE和SELECT是一个MySQL的关键字...等。 做完了这些之后就会进行"语法分析",语法分析就是判断这些关键字是否合法,如果你输入的SQL语句语法不正确就是有提示,比如WHERE关键字少个W

SELECT * FROM T HERE ID = 10;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ID = 10' at line 1
复制代码

通过以上的输出,我们能看到语法的检测是在分析器阶段执行的,如果遇到syntax error,只需要关注 use near 关键字后面的部分。 ###优化器 优化器顾名思义就是对SQL语句做优化的步骤,那就有同学有问题了,SQL语句都写好了,MySQL系统还能对其做优化?答案是:当然能。

SELECT * FROM t1 JOIN t2 ON `id` WHERE t1.a = 10 AND t2.b = 20;
复制代码

上面是一条简单的SQL语句,系统的执行顺序可以如下:

  • 可以先查询t1表中a字段等于10的数据,然后根据查询结果通过ID关联t2表,判断t2表中的b字段是否等于20。
  • 也可以先查询t2表中b字段等于20的数据,然后根据插叙结果通过ID关联到t1表,判断t1表a字段是否等于10。

还有一些是关于数据库索引的优化,这个部分比较复杂,后面会单独讲到。

执行器

当前面几个步骤完成的时候就开始进入到执行器阶段,执行器首先会做权限校验,判断当前用户是否有该SQL语句的操作权限,如果没有则会报错。

DELETE FROM t;
ERROR 1142 (42000): DELETE command denied to user 'test'@'localhost' for table 't'
复制代码

如果权限校验也通过就会真正的执行查询,查询是通过调用引擎提供的API。

引擎

引擎层是通过插件的形式存在的,存储引擎负责MySQL中数据的储存和提取。服务器通过API与储存引擎行进通信,这些API屏蔽了不同引擎之间的差异,使得引擎的差异对服务层没有影响。不同的数据存储引擎之间也是不通信的,互相之间不会影响。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Tornado

Introduction to Tornado

Michael Dory、Adam Parrish、Brendan Berg / O'Reilly Media / 2012-3-28 / USD 23.99

Tornado is a scalable, non-blocking web server and web application framework written in Python. It is also light-weight to deploy, fun to write for, and incredibly powerful. Tornado was written with p......一起来看看 《Introduction to Tornado》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具