mysql中一条SQL查询语句是如何执行的?

mysql中一条SQL查询语句是如何执行的?

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

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核 心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引 擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。支持 InnoDB、 MyISAM等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

1:连接器:

连接器负责跟客户端 建立连接、获取权限、维持和管理连接,建立连接之后我们需要输入账号和密码,如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接 里面的权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修 改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限 设置。

2.查询缓存

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前 执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询 的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于 利。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清 空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新 压力大的数据库来说,查询缓存的命中率会非常低。

需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻 底没有这个功能了。
 

3:分析器

分析器进行语法分析, 看看输入的sql语句语法是否满足mysql语法,不满足的话,会收到就会收到“You have an error in your SQL syntax”的错误提醒。

4. 优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处 理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联 (join)的时候,决定各个表的连接顺序。

5.执行器

开始执行之前,判断一下对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误,如果有权限,就执行这条sql语句。