一条SQL语句从开始到结束到底经历了什么?

Posted 似水流年,是谁苍白了等待

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一条SQL语句从开始到结束到底经历了什么?相关的知识,希望对你有一定的参考价值。

mysql逻辑架构图

借用很经典的一幅图,先来个全局的了解,SQL执行到底有哪些步骤。

Mysql逻辑架构分为两层

  • 第一层Server层
  • 第二层存储引擎层

Server层

连接器

是指通常我们所看见的在创建一个表的时候需要连接数库,所以在连接数据库时候就需要用到连接器,保证客户端能连接到数据库。连接器就负责跟客户端建立连接获取权限,维持和管理连接。

在连接完成后,如果没有其他的操作便处于空闲状态,默认8小时自动断开连接,当下次进行操作的时候需要重新连接数据库。

但是在连接之前咱们还有一个必不可少的环节,那就是需要通过TCP的三次握手连接MySQL服务。具体三次握手的过程是什么样的,详情见:TCP三次握手四次挥手

如下连接MySQL

连接命令:

mysql -h$ip -P$port -u$user -p

连接命令中的mysql是客户端工具,用来跟服务端建立连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

  • 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。
  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限

查询缓存

当连接器连接成功之后,所执行的SQL从缓存查询结果,如果有结果直接返回,没结果就继续往下走,走分析器,在查询的时候在SQL语句中写上关键字SQL_CACHE,表示要查缓存。在MySQL8.0之后就取消了查询缓存这一过程,取消了缓存。

分析器

假如对下列SQL进行分析

如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL需要知道你要做什么,因此需要对SQL语句做解析。分析器分析分为两个阶段,分别是词法分析和语法分析

  • 词法分析

分析器先会做词法分析:你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么,识别哪些是关键字,哪些不是关键字。

  • 语法分析

将SQL语句解析成一颗语法树

MySQL从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“student”识别成“表名T”,“username”识别为要查询的结果。

如果要查询的字段在数据表中不存在,在词法分析中就会出错,比如:

说明这个字段在表中不存在,在词法分析阶段就会被查出来。

 

优化器

将根据执行的SQL,决定执行那部分,比如说有联表查询,通过join连接,则优化器就会判断先连接那个表,表里有多个索引的时候决定用那个索引,最终生成一个执行计划进行执行。

执行器

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

 

 

 

 

 

以上是关于一条SQL语句从开始到结束到底经历了什么?的主要内容,如果未能解决你的问题,请参考以下文章

天啦,从Mongo到ClickHouse我到底经历了什么?

一条sql 语句查询用户表,返回每天的用户量和时间,表里面的时间是时间戳的格式

从浏览器输入网址回车到看到页面过程到底经历了什么?

SQL 中的 EXISTS 到底做了什么?

SQL:一张表里,一次执行两条更新的语句,怎么写?

sql语句 查询一个月的几个周的数据