执行流程

大概分成7个步骤

客户端发sql请求

查询缓存

很鸡肋,高版本中已经废弃

解析器

Parser:对语句基于 SQL 语法进行词法和语法分析和语义的解析

  1. 词法解析:把一个完整的 SQL 语句打碎成一个个的单词
  2. 语法解析:语法分析会对 SQL 做一些语法检查,比如单引号有没有闭合,然后根据 MySQL 定义的语法规则,根据 SQL 语句生成一个数据结构。这个数据结构我们把它叫做解析树(select_lex)
  3. 任何数据库的中间件,比如 Mycat,Sharding-JDBC(用到了 Druid Parser),都必须要有词法和语法分析功能,在市面上也有很多的开源的词法解析的工具(比如 LEX,Yacc)

预处理

Preprocessor:检查语义是否正确

  1. 如果我写了一个词法和语法都正确的 SQL,但是表名或者字段不存在,会在哪里报错?是在数据库的执行层还是解析器?
  2. 解析器可以分析语法,但是它怎么知道数据库里面有什么表,表里面有什么字段呢?实际上还是在解析的时候报错,解析 SQL 的环节里面有个预处理器。它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表和列名是否存在,检查名字和别名,保证没有歧义。预处理之后得到一个新的解析树

查询优化器

Optimizer:查询优化器的模块,基于成本的优化器

  1. 一条 SQL 语句是可以有很多种执行方式,最终返回相同的结果,他们是等价的
  2. 查询优化器的目的就是根据解析树生成不同的执行计划(Execution Plan),然后选择一种最优的执行计划,MySQL 里面使用的是基于开销(cost)的优化器,选用开销最小的执行计划
  3. 查看查询的开销
show status like 'Last_query_cost';
  1. 准备阶段、优化阶段和执行阶段,优化之后生成执行计划

执行计划

  1. 查看执行计划
EXPLAIN select name from user where id=1;
-- 格式化的执行计划
explain FORMAT=JSON select * from tb_base;

执行引擎 -》存储引擎

返回结果到客户端