0
点赞
收藏
分享

微信扫一扫

一条SQL在MySQL中的执行过程

生命中最美的是成长 04-01 11:00 阅读 1

图解: 

第⼀步:连接器

过程

1. 建⽴连接:与客户端进⾏ TCP 三次握⼿建⽴连接;

2. 校验密码:校验客户端的⽤户名和密码,如果⽤户名或密码不对,则会报错;3. 权限判断:如果⽤户名和密码都对了,会读取该⽤户的权限,然后后⾯的权限逻辑判断都基于此时读取到的权限;

第⼆步:查询缓存

过程

解析出 SQL 语句的第⼀个字段,看看是什么类型的语句。

如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )⾥查找缓存数据。 如果查询的语句命中查询缓存,那么就会直接返回 value 给客户端。

如果查询的语句没有命中查询缓存中,那么就要往下继续执⾏,等执⾏完后,查询的结果就会被存⼊查询缓存中。

缺点

版本变动

第三步:解析 SQL

过程

1. 词法分析

2. 语法分析

3. 语法不对,解析器就会给报错

注意:表不存在或者字段不存在,并不是在解析器⾥做的,解析器只负责构建语法树和检查语法,但是不会去查表 或者字段存不存在。

第四步:执⾏ SQL

过程

1. prepare 阶段,也就是预处理阶段;

2. optimize 阶段,也就是优化阶段;

3. execute 阶段,也就是执⾏阶段;

1 预处理器

检查 SQL 查询语句中的表或者字段是否存在;

select * 中的 * 符号,扩展为表上的所有列;

2 优化器

优化器主要负责将 SQL 查询语句的执⾏⽅案确定下来 ⽐如在表⾥⾯有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使⽤哪个索引

要想知道优化器选择了哪个索引,我们可以在查询语句最前⾯加个 explain 命令

3 执⾏器

执⾏器就会和存储引擎交互了,交互是以记录为单位的。

三种⽅式执⾏过程

  • 主键索引查询
  • 全表扫描
  • 索引下推(MySQL 5.6 推出的查询优化策略)

特点

  • 执⾏器查询的过程是⼀个 while 循环
  • Server 层每从存储引擎读到⼀条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的, 是因为客户端是等查询语句查询完成后,才会显示出所有的记录

总结

执⾏⼀条 SQL 查询语句,期间发⽣了什么?

1.连接器:建⽴连接,管理连接、校验⽤户身份;

2.查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执⾏。MySQL 8.0 已删除该模块;

3.解析 SQL,通过解析器对 SQL 查询语句进⾏词法分析、语法分析,然后构建语法树,⽅便后续模块读取表 名、字段、语句类型;

4.执⾏ SQL:执⾏ SQL 共有三个阶段:

  • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
  • 优化阶段:基于查询成本的考虑,选择查询成本最⼩的执⾏计划;
  • 执⾏阶段:根据执⾏计划执⾏ SQL 查询语句,从存储引擎读取记录,返回给客户端
举报

相关推荐

0 条评论