执行流程
大概分成7个步骤
客户端发sql请求
查询缓存
很鸡肋,高版本中已经废弃
解析器
Parser:对语句基于 SQL 语法进行词法和语法分析和语义的解析
- 词法解析:把一个完整的 SQL 语句打碎成一个个的单词
- 语法解析:语法分析会对 SQL 做一些语法检查,比如单引号有没有闭合,然后根据 MySQL 定义的语法规则,根据 SQL 语句生成一个数据结构。这个数据结构我们把它叫做解析树(select_lex)
- 任何数据库的中间件,比如 Mycat,Sharding-JDBC(用到了 Druid Parser),都必须要有词法和语法分析功能,在市面上也有很多的开源的词法解析的工具(比如 LEX,Yacc)
预处理
Preprocessor:检查语义是否正确
- 如果我写了一个词法和语法都正确的 SQL,但是表名或者字段不存在,会在哪里报错?是在数据库的执行层还是解析器?
- 解析器可以分析语法,但是它怎么知道数据库里面有什么表,表里面有什么字段呢?实际上还是在解析的时候报错,解析 SQL 的环节里面有个预处理器。它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表和列名是否存在,检查名字和别名,保证没有歧义。预处理之后得到一个新的解析树
查询优化器
Optimizer:查询优化器的模块,基于成本的优化器
-
一条 SQL 语句是可以有很多种执行方式,最终返回相同的结果,他们是等价的
-
查询优化器的目的就是根据解析树生成不同的执行计划(Execution Plan),然后选择一种最优的执行计划,MySQL 里面使用的是基于开销(cost)的优化器,选用开销最小的执行计划
-
查看查询的开销
show status like 'Last_query_cost';
-
准备阶段、优化阶段和执行阶段,优化之后生成执行计划
-
…
执行计划
-
查看执行计划
EXPLAIN select name from user where id=1; -- 格式化的执行计划 explain FORMAT=JSON select * from tb_base;
-
…