一、执行流程总览

查询语句执行过程.png
此图来源:https://www.cnblogs.com/GeekHuman/p/9982940.html

二、详细分析

1.查询缓存
如果命中缓存,直接返回结果。

MySql有一个缓存模块,默认是关闭的,并且在mysql8.0的版本中,已被移除;这个缓存模块应用场景非常有限,可以说是“鸡肋”:A.要求SQL语句和缓存中的必须一摸一样,空格、字母大小写的差异均会被认为是不同的SQL语句;B.表中的数据发生改变,这一张表的缓存就会失效。

2.解析器
对sql语句进行词法解析以及语法解析,生成解析树。

-词法解析:识别sql语句中的字符串分别是什么表示什么;

-语法解析:判断sql语句是否满足mysql的语法。

3.预处理器

预处理器,会进行语义解析(检查之前生成的解析树,是否有表名、字段名问题,别名是否存在歧义等),并生成一个新的解析树。

4.查询优化器

查询优化器会对解析树进行优化,包括多表查询(JOIN)决定表的连接顺序、选择索引、查询条件优化(移除恒等式、子查询和连接查询)等,并生成执行计划(sql语句之前加上“EXPLAIN”可以查看执行计划的信息)。

5.执行器

先判断是否有执行查询的权限,然后查询执行引擎,获取数据,并返回给客户端


有个小的注意点,为什么在执行器中判断是否拥有查询权限?

sql语句要操作的表可能并不只是sql语句表面的表;例如,触发器要在执行器执行过程中才能确定。



有理解错误的地方,望留言指正,谢谢!

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

一个喜欢拔刀的萌新Coder