Mysql精进之路-SQL查询语句的执行过程

Dcr 1年前 ⋅ 1030 阅读

首先从Mysql的逻辑架构开始说起,分为Server层和存储引擎层两部分.

Server层包括连接器,缓存,分析器,优化器,执行器等,涵盖了Mysql的大多数核心功能,以及所有的内置函数,所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器,视图等.

连接器

负责跟客户端建立连接、获取权限、维持和管理连接.连接命令一般这么写 ` mysql -h$ip -P$port -u$user -p `  输入命令之后,你就需要在交互命令行内输入密码.

在完成TCP握手后,连接器就开始认证你的身份.如果用户密码不对返回 "Access denied for user" ,如果认证通过连接器会到权限表里获取该用户的权限.后续这个连接的权限判断逻辑都依赖于此时读取到的权限.这就意味着,一个用户成功建立连接后,即使管理员对这个用户的权限作出修改,也不会影响已经存在的连接权限.

连接完成后,如果不做任何操作这个连接默认存活8小时,这个时间由 `wait_timeout` 控制.

查询缓存

MySQL拿到一个查询请求后,会先查询缓存,检查之前是否执行过该语句.执行过的语句会以key-value的形式,存在内存里.key是查询语句,value是查询结果.如果命中则直接返回结果给客户端.如果没有命中,则继续执行后面的操作,完成后存入缓存.

但是这里需要注意一个问题,如果表有更新操作,这个表上的查询缓存将会被清空.所以对于有频繁更新操作的表不建议开启缓存,对于缓存的设置可以将参数`query_cache_type`设置成`DEMAND`,这样对于默认的SQL语句都不使用查询缓存.但是可以用`SQL_CACHE`显式指定类似于` select SQL_CACHE * FROM T WHERE id=10; `

注意:MySQL8.0彻底删除了缓存功能

分析器

如果没有命中缓存,就要开始真正执行语句了.分析器会先做"词法分析"分析sql语句中的关键字,然后在进行语法分析判断是否满足MySql语法.

优化器

优化器是在表里存在多个索引的时候,确定使用哪个索引;或者在一个语句有多表关联的时候,确定各个表的连接顺序.

执行器

开始执行的时候,要先判断该用户对目标表有没有对应的操作权限,如果没有会返回没有权限的错误.如果有则打开表继续执行,执行器会根据表的引擎定义,使用这个引擎提供的接口.

比如表 T 中,ID 字段没有索引,那么执行器的执行流程是这样的:

1.调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;

2.调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

3.执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。

对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

 

 

 

全部评论: 0

    我有话说: