【MySQL】1|一条SQL查询语句是如何执行的

2022-01-05  本文已影响0人  学而思之

这个系列是学习极客时间《MySQL 实战 45 讲》的笔记,希望有所帮助,同时建议大家直接阅读原作。

大体上说 MySQL 可以分为 Server 层和存储引擎层两部分。

MySQL简要分层

从图中可以看出,Server 层是统一的,存储引擎可以有多个。

1、连接器

负责和客户端建立连接、获取权限、维持和管理连接。

可以通过 show processlist命令查看所有的连接。

因为建立连接比较复杂,为提高性能,建议使用长连接。

另外MySQL在执行过程中用到的临时内存是管理在连接对象中的,及时释放和重新初始化连接能有效降低MySQL内存占用。

2、查询缓存

MySQL 在拿到查询语句后,会先到查询缓存查看是否执行过,如果能找到(语句作为key,结果作为value),则直接返回查询结果。

如果不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存。

看似效率很高,但是非特定场景建议不要使用查询缓存。

查询缓存的失效会非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会失效。对于写多读少的场景不适用,除非有一张静态表,很少更新的那种场景。

可以通过 query_cache_type 来设置是否全局启用。对于确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,如:

mysql> select SQL_CACHE * from T where ID = 10;

另外,MySQL 8.0 版本直接将查询缓存模块去掉了,也意味着上述设置在 MySQL 8.0 版本不能使用。

3、分析器

没有命中缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什么,因此要对SQL语句进行解析。

先做词法分析,识别出SQL语句里面的字符串分别是什么,代表什么。

再做语法分析,会根据语法规则,判断这个SQL语句是否满足MySQL语法。

如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。

4、优化器

经过了分析器,MySQL 就知道要做什么了。在开始执行前,还要经过优化器的处理。

优化器阶段完成后,这个语句的执行方案就确定下来了,然后会进入执行器阶段。

5、执行器

MySQL 通过分析器知道要做什么,通过优化器知道要怎么做,接下来就是执行阶段。

  1. 先判断当前连接是否有查询的权限,如果没有就会返回没有权限的错误。 xxx command denied to user xxxxx
  2. 有权限,就打开表继续执行。查询所有满足条件的行组成的记录作为结果集返回给客户端。
上一篇下一篇

猜你喜欢

热点阅读