目录

一条查询语句的执行流程

李羽秋
李羽秋 2023年10月21日  ·  阅读 1,109

一条查询语句的执行流程

1. 基础组件介绍

在了解一条查询语句执行的整个流程之前,先了解一下mysql底层的一些组件,通过了解各个组件的组件,才能更好地了解执行流程。

img

连接器

连接器的作用是通过它与mysql建立连接,主要负责与客户端建立通信,验证用户名与密码是否正确。当然数据库也使用了池化技术,在系统第一次启动的时候提前与数据库建立了连接,放到数据库连接池中。

查询缓存

查询缓存是将之前执行的sql语句以key-value的形式缓存在内存中,如果命中了缓存,就无需进行后面复杂的流程。

分析器

分析器的主要作用是对sql语句进行分析:

  • 首先会进行“词法分析”,比如我们输入一条由多个字符串和空格组成的sql语句,mysql会识别出里面的字符串分别是什么,代表什么
  • 其次,需要做“语法分析”,判断我们输入的sql语句是否满足mysql语法。

优化器

在开始执行sql语句之前,需要经过优化器进行处理。比如我们在表中设置多个索引,优化器可以帮助我们决定使用哪个索引。

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

该sql语句将会有两种选择:

  • 既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20。
  • 也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。

优化器会从两种方案中选出最优方案。

执行器

该组件主要对sql进行执行,在开始执行时会判断是否对某个表有一定的执行查询的权限。

2. 执行流程

  1. 与MySQL建立连接:输入用户名与密码验证身份
  2. 查询缓存:mysql拿到查询请求后,先查看缓存中是否存在,如果存在则直接返回结果。
  3. 分析器:如果未命中查询缓存,则进行sql语句解析,检查sql语句是否满足mysql语法
  4. 优化器:优化器主要作用是帮我们选择最优的方案
  5. 执行器:经过优化之后,最后执行sql语句。

3. 是否要开启查询缓存

正常情况下,是不建议使用查询缓存的。mysql8.0版本直接取消了查询缓存。

对于缓存来说,最头疼的就是缓存失效。比如我们对一个表进行更新,这个表上的所有查询缓存就被清空了。当你费劲地将结果保存起来,还没使用,整个表就清空了,从收益方面很不值得。特别对于更新频繁的时候,查询缓存的命中率会非常低。

查询缓存适用场景

我们的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

设置缓存开启

在MySQL中,可以通过设置query_cache_type参数来控制查询缓存的开启和关闭。该参数共有三个可选值:

  • 0:表示关闭查询缓存。
  • 1:表示开启查询缓存,并且只缓存结果集,不缓存查询计划。
  • 2:表示开启查询缓存,并且同时缓存结果集和查询计划。
分类: mysql
标签: MySQL(new)