流程图
- 连接器:建立连接,管理连接、校验用户身份;
- 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
- 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析(判断语法格式是否正确),然后构建语法树,方便后续模块读取表名、字段、语句类型;
- 预处理阶段:检查表或字段是否存在(对于 MySQL 5.7 判断表或字段是否存在的工作,是在词法分析&语法分析之后,prepare 阶段之前做的,MySQL 8.0 开始在预处理阶段判断);将 select * 中的 * 符号扩展为表上的所有列。
- 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划(比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引);
- 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;