一条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通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句,返回查询结果。

 

 

 

 

 

评论 92
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值