【MySQL】 SQL的执行过程

59 阅读2分钟

1 执行流程

image.png

2 连接器

连接处理的过程如下

  1. 建立连接。 TCP三次握手
  2. 获取权限。 校验输入的用户名、密码,通过之后从权限表中获取用户权限
  3. 管理连接。 连接完成后,如果你没有后续的动作,这个连接就处于空闲状态。空闲状态时长由参数 wait_timeout控制的,默认值是 8 小时。

3 查询缓存

查询缓存缓存数据的结构是kv键值对

  • key是查询语句
  • value是查询语句的返回结果

缓存处理逻辑:MySQL 拿到一个查询请求后,会先到查询缓存看看,如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。

注意(8.0移除)

  • 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。对于更新频率比较高的数据表,查询缓存的命中率很低,失去了缓存的意义。

  • 是否启用查询缓存是可以参数控制的。可以将参数query_cache_type设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存;或者显示制定哪些sql使用查询缓存,命令如下:

    mysql> select SQL_CACHE * from T where ID=10

4 分析器

  • 词法分析 你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。
  • 语法分析 语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法

5 优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。优化的细则还有很多,这里面就不一一介绍啦。

6 执行器

  • 开始执行的时候,要先判断一下你对这个表 T 有没有执行操作的权限,如果没有,就会返回没有权限的错误
  • 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的操作接口。