SQL语句到底是如何执行的

SQL语句到底是如何执行的

想必大家对于SQL语句或多或少都有些了解,但你知道SQL语句在MySQL上是怎么运行的么,它到底做了哪些操作呢?

SQL执行过程示意图

在这里插入图片描述

连接器

连接器,顾名思义,作用就是与MySQL服务器建立连接用的。连接器负责跟客户端建立连接、维持和管理连接。客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数wait_timeout控制的,默认值是8小时。

曾经看到过一个案例:一个政府机构性质的项目,由于该机构每天下午5点左右下班,第二天早上9点上班,在这期间,系统无人使用,机构工作人员上班后登陆系统,发现系统异常,开发人员查询日志后发现数据库连接异常。正是由于wait_timeout的默认值8小时引起的,这种情况可以相应的调整wait_timeout的数值即可。

查询缓存

查询缓存就是对查询结果进行缓存,是一个基于key-value的缓存,其中key是查询的SQL字符串,只有完全一样的SQL才使用同一个缓存。

当成功建立连接后,MySQL优先回去查询缓存中看一下有没有缓存结果,如果有直接返回结果。

可以用SQL_CACHE显式指定需要缓存的语句:

SELECT SQL_CACHE * FROM t1 WHERE a=1;

查询缓存往往弊大于利:

  • 查询缓存失效频繁,对一个表的更新操作都会导致这个表的所有查询缓存失效。
  • 查询缓存占用内存。
  • 在现在NOSQL的日益壮大的今天,查询缓存显得有点鸡肋。

所以MySQL 8.0版本直接将查询缓存的整块功能移除了。个人建议:尽量不要使用查询缓存或者在特殊场景使用。

分析器

在这一步,分析器对SQL语句进行解析:

扫描二维码关注公众号,回复: 9886496 查看本文章
  1. 词法分析
  2. 语法分析

优化器

进行了词法分析和语法分析之后,要经过优化器的处理,再交给执行器执行。在这一步,优化器根据SQL语句做相应的优化,包括选择索引,表的连接顺序,表达式优化,索引下推等,相关详情可参考SQL优化之Select语句

执行器

MySQL通过分析器知道了你要做什么,这样做是否合法,通过优化器知道了到底要怎么做,给出优化的执行计划,之后就到达了执行器这里,开始执行:

  1. 开始执行的时候,要先判断用户对这个表T有没有查询权限,如果没有,就会返回权限的错误;

  2. 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

然后将执行结果返回给客户端。

到这里,整个SQL的执行流程已经完毕。

发布了10 篇原创文章 · 获赞 36 · 访问量 9405

猜你喜欢

转载自blog.csdn.net/qq_36011946/article/details/104904295
今日推荐