一条查询SQL的执行过程

1.1 假设

查询语句为:mysql> select * from T where ID = 10

1.2 总体执行流程

在这里插入图片描述

1.2.1 连接器 -> 连接

  1. 作用:负责跟客户端建立连接、获取权限、维持和管理连接等
  2. 工作流程:
    一个用户成功建立连接后,如果客户端太长时间没有请求,连接器会自动断开。时间是由参数wait_timeout控制的,默认值是8小时.
  3. 长连接:如果客户端持续有请求,则一直使用同一个连接
  4. 短连接:每次执行完很少的几次查询就断开连接,下次查询在重新建立一个
  5. 推荐使用长连接。长连接存在的问题:长时间使用长连接会造成内存消耗特别快,导致Mysql异常重启。解决方案为:
    5.1 定期断开长连接。使用一段时间后,或者程序里面执行过一个占用内存大的操作后,断开连接,之后要查询连接。
    5.2 若使用的是MySQL 5.7或更新版本,可以在每次执行完一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。

1.2.2 查询缓存 ->走捷径

连接成功后,可以执行select语句。执行流程如下:

  1. MySQL拿到一个查询请求后,会先去查询缓存看看。若以前执行过这条语句,则这条语句以及结果会以key-value对的形式,被直接缓存在内存中。key是查询语句、value是查询结果。在缓存中查找到key,则value将会被直接返回给客户端;
  2. 若不在缓存中,继续后面的执行阶段。执行完后,执行结果会被放入查询缓存中。这样下一次查询相同sql语句时,直接从内存返回,效率非常高。

疑问:大多数情况下,为什么不建议使用查询缓存?

查询缓存失效非常频繁,只要有一个表的更新,这个表上所有的查询缓存都会被清空,可能刚缓存完毕,还没有使用就被全部清空。尤其对更新压力大的数据库来说,缓存命中堵塞效率非常低。如果业务就是一张静态表,很长时间才更新一次,建议使用查询缓存。
解决方案:提供【按需使用】的方式。设置参数query_cache_type为DEMAND. 【默认情况】下,不使用查询缓存。在MySQL8.0版本直接删除查询缓存的功能。

1.2.3 分析/解析器 -> 做什么what

作用: 如果没有命中查询缓存,开始真正执行语句。MySQL首先需要知道你要做什么,因此需要对SQL语句做解析。流程如下:

先执行词法分析。由于输入的时一串由字符串和空格组成的SQL语句,需要识别出字符串是什么含义,可以做什么;
例:首先,识别"select",表明是一个查询语句;其次,识别字符串"T"为"表名T",字符串"ID"识别成"列ID"
语法分析:根据词法分析的结果,语法分析器会根据"语法规则",判断输入的SQL语句是否满足MySQL语法。例:
mysql> elect * from t where ID=1; --> elect 错误
主要是关键字是否错误以及关键字的顺序是否正确;以及表\列是否存在

1.2.5 优化器 -> 怎么做(与索引有关) how

作用:在表里面由多个索引的时候,决定使用哪个索引或者一个语句中有多表关联(join)的时候,决定各个表的连接顺序(不同的连接顺序会导致执行效率的不同)。

1.2.6 执行器 -> 开始begin

执行流程: 开始执行的时候,判断你对表T是否有查询的权限:若没有,返回查询权限的错误;若有,打开表继续执行。打开表的时候,执行器根据表的引擎定义,去使用该引擎提供的接口
无索引执行流程:

  1. 调用InnoDB引擎接口取这个表的第一行。判断ID值是否为10,如果不是则跳过;如果是将这行存在结果集中。
  2. 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行;
  3. 执行器将上述遍历过程中所有条件的行组成的记录集作为结果集返回给客户端。
    例如:共需要查询100条数据,则需要调用存储引擎接口100次

有索引执行流程:大致逻辑相同。区别: 调用InnoDB引擎接口取满足条件的第一行,之后循环取满足条件的下一行。

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃花猿

客官,赏点打酒钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值