一条SQL查询语句是如何执行的

10 分钟阅读 878 字 + 702 词
参考答案:
  1. 连接器 :连接器负责跟客户端 建立连接、获取权限、维持和管理连接
  2. 查询缓存 : MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中,但是查询缓存这个功能是弊大于利的,当表只要发生更新,那么缓存就完全失效了,所以只适合用在静态表上,在mysql8.0之后,这个功能就被完全移除掉了。
  3. 分析器 :你输入的是由多个字符串和空格组成的一条 SQL 语句,此时需要进行 词法分析和语法分析 MySQL 需要识别出里面的字符串分别是什么,代表什么。
  4. 优化器 :先有 预处理 阶段, 检查表或者字段是否存在 。优化器是在表里面有多个索引的时候, 决定使用哪个索引 ; 或者在一个语句有多表关联( join )的时候,决定 各个表的连接顺序
  5. 执行器 : MySQL 通过分析器知道了你要做什么 通过优化器知道了该怎么做 ,于是就进入了执行阶段与存储引擎开始交互,开始执行语句。
但是对于更新流程的话,还会涉及到日志模块,redolog和binlog,undolog。
img
总结:
首先呢,MYSQL的架构分为两层: Server层和存储引擎层。
Server层是负责建立连接,分析和执行SQL语句的。
1.==连接器:==
在执行语句前首先要和服务层建立连接,第一步是 连接器 的工作,负责跟客户端 建立连接 ,获取权限,维持和管理连接。
2.==查询缓存==
连接器完成工作之后, MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。但是实际上对于更新频繁的表来说,查询缓存的命中率很低。所以Mysql8.0版本开始,就将查询缓存删掉了。
3.==解析器(包含在分析器中)==
之后呢是进行解析SQL,这个工作是交给解析器来做的。== 解析器进行词法分析和语法分析 。==
SQL没有语法问题之后然后执行SQL,每条 SELECT 查询语句流程主要可以分为下面这三个阶段:
预处理阶段;优化阶段;执行阶段;
4.==预处理器==
预处理阶段是 检查语句中的表或者字段是否存在 ,并将*号扩展为表的所有列。
5.==优化器==
经过预处理阶段后,还需要为 SQL 查询语句先制定一个执行计划 ,这个工作交由「优化器」来完成的。==优化器主要负责将 SQL 查询语句的执行方案确定下来==,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑, 来决定选择使用哪个索引
6.==执行器==
经历完优化器后,就确定了执行方案,接下来 MySQL 就真正开始执行语句了,这个工作是由「执行器」完成的。在执行的过程中, 执行器就会和存储引擎交互 了,交互是以记录为单位的。