【每日一问】一条查询SQL是如何执行的?

127 阅读3分钟
MySQL的基本架构

MySQL的基本架构分为两大层,上层是service层,包括连接器、查询缓存、分析器、优化器、执行器等。涵盖了MySQL大多数的核心服务功能,以及所有的 内置函数,所有跨引擎的功能都是在这一层实现的,比如存储过程、触发器、视图等等。下层是引擎层,主要的功能是存储和数据提取,引擎层的架构模式是插件式的,支持innodb等多种存储引擎。

image-20211014085813773

连接器

第一步,执行SQL前需要连接到数据库,连接器负责和客户端建立连接、获取权限、维持和管理连接."mysql"作为客户端工具,用来和服务端建立连接,在完成经典的tcp握手后,连接器就开始验证你的身份,用户名、密码验证成功后,连接器会到权限表中查询你拥有的权限。之后连接中所有的权限判断逻辑都依赖这里读取到的权限。

即使管理员对这个用户权限做了修改,仍然不会影响已经存在的连接的权限,账号的修改只对新的连接生效

另外,作为连接的管理者,客户端在长时间没有动静,就会达到一定的时间阈值(8h)后将其断开。

查询缓存(8.0版本开始已经删除)

连接建立完成后,在开启查询缓存后,就会进入查询缓存,拿到一条SQL过后会首先到内存中查看是否命中查询缓存,如果命中,首先做权限判断,通过后直接返回结果给客户端,否则进行下一步。但是不推荐使用查询缓存,因为查询缓存失效非常频繁,只要数据表发生更新,就会导致所有的查询缓存失效。一般只有一些静态数据表或者很久才进行一次更新的数据表才开启查询缓存。

分析器

如果SQL没有命中查询缓存,就要开始真正的执行SQL语句。首先分析器会对SQL进行词法分析,所谓词法分析就是把SQL看成是很多的字符串和空格组成的 一条语句,词法分析的功能就是分析每个字符串的是什么含义。比如,通过关键词select分析出该语句是一条查询语句。紧接着要进行的是语法分析,根据词法分析的结果,判断输入的SQL语句是否符合语法规则。

优化器

经过了分析器之后,MySQL就知道你要做什么了,在执行SQL之前,需要对SQL进行优化处理。优化器是在表里有多个索引的时候决定使用哪个索引,或者多表连接查询的时候决定连接的顺序等。

执行器

MySQL通过分析器知道了你要做什么,通过优化器知道了怎么做,接下来就进入了执行器阶段。开始执行的时候,需要判断一下你是否拥有对应的操作权限。(如果是命中缓存,在返回结果前做权限判断)

一条更新SQL是如何执行的