page contents

一条SQL查询语句是如何执行的?

一条SQL语句在MYSQL内部执行的过程涉及到的内部模块有:连接器、查询缓存、分析器、优化器、执行器、存储引擎。


attachments-2020-04-lCURyqv35ea67c98a1ef2.jpg

导读

Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,但是作为一个老司机,仅仅会用真的不够。

今天透过一个简单的查询语句来讲述在Mysql内部的执行过程。

select * from table where id=10;


撸它

首先通过一张图片来了解一下Mysql的基础架构,如下:

attachments-2020-04-6bLjtuBm5ea67d11e1fca.png

从上图可以看出,Mysql大致分为Server层和存储引擎层两部分

Server层包括连接器、查询缓存、分析器、优化器等,其中包含了Mysql的大多数核心功能以及所有的内置函数(如日期,时间函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。它的架构是可插拔式的,支持InnoDB、MyISAM等多个存储引擎。Mysql中主流的存储引擎是InnoDB,由于它对事务的支持让它从Mysql5.5.5版本开始成为了默认的存储引擎。


大致了解了整体架构,现在说说每一个基础的模块都承担着怎样的责任。


1. 连接器

顾名思义,是客户端和Mysql之间连接的媒介,负责登录、获取权限、维持连接和管理连接。

连接命令一般如下:

mysql [-h] ip [- P] port -u [user] -p

在完成经典的TCP握手后,连接器会开始认证身份,要求输入密码。

密码认证通过,连接器会查询出拥有的权限,即使管理员修改了权限,也不会影响你这次的连接,只有重新连接才会生效。

密码认证失败,会收到提示信息Access denied for user。

连接完成后,没有后续动作的连接将会变成空闲连接,你可以输入show processlist命令看到它。如下图,其中的Command这一列显示为sleep的这一行表示在系统里面有一个空闲连接。

attachments-2020-04-c3pb29e65ea67d4a7732d.png

客户端如果太长时间没有执行动作,连接器将会自动断开,这个时间由参数wait_timeout控制,默认值是8小时。

如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒:Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。


2. 查询缓存【废材,8.0 版本完全删除】

连接建立完成后,你就可以select语句了,执行之前会查询缓存。

查询缓存在Mysql中的是默认关闭的,因为缓存命中率非常低,只要有对表执行一个更新操作,这个表的所有查询缓存都将被清空。怎么样?一句废材足以形容了!!!

废材的东西不必多讲,主流的Redis的缓存你不用,别再搞这废材了。


3. 分析器

如果没有命中查询缓存,就要执行查询了,但是在执行查询之前,需要对SQL语句做解析,判断你这条语句有没有语法错误。

分析器会做 '词法分析' ,你输入的无非可就是多个字符串和空格组成的SQL语句,MYSQL需要识别出里面的字符串是什么,代表什么,有没有关键词等。

MYSQL会从你输入的select 这个关键字识别出来是一个查询语句,table是表名,id是列名。

做完这些会做 '语法分析' ,根据MYSQL定义的规则来判断你的SQL语句有没有语法错误,如果你的语法不对,就会收到类似如下的提醒:

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 'elect * from t where ID=1' at line 1

一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。


4. 优化器

经过分析器词法和语法的分析,此时就能知道这条SQL语句是干什么的。但是在开始执行之前,MYSQL底层还要使用优化器对这条SQL语句进行优化处理。

MYSQL内部会对这条SQL进行评估,比如涉及到多个索引会比较使用哪个索引代价更小、多表join的时候会考虑决定各个表的连接顺序。

优化器的作用一句话总结:

根据MYSQL内部的算法决定如何执行这条SQL语句来达到MYSQL认为代价最小目的。

优化器阶段完成后,这个语句的执行方案就确定了,接下来就交给执行器执行了。


5. 执行器

MYSQL通过分析器知道了要做什么,通过优化器知道了如何做,于是就进入了执行器阶段。

执行器开始执行之前,需要检查一下用户对表table有没有执行的权限,没有返回权限不足的错误,有的话就执行。

执行也是分类的,如果Id不是索引则全表扫描,一行一行的查找,如果是索引则在索引组织表中查询,索引的查询很复杂,其中涉及到B+树等算法,这里不再详细介绍。


总结

一条SQL语句在MYSQL内部执行的过程涉及到的内部模块有:连接器、查询缓存、分析器、优化器、执行器、存储引擎。


attachments-2020-04-FTBW0tnq5ea67dec17f7a.jpg

  • 发表于 2020-04-27 09:41
  • 阅读 ( 546 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章