前言
本系列基于极客时间MySQL45讲,加以自己的理解以及查阅博客等资料汇总整理,以供大家一起交流学习。
MySQL组件分层
MySQL可以分为Server层与存储引擎层。
Server层包括:
- 连接器
- 查询缓存
- 分析器
- 优化器
- 执行器
- 其他内置函数的实现(日期、时间、数学、加密等)
具体作用举例:
存储过程、触发器、视图等。
存储引擎层包括:
数据的提取和存储。
其架构模式是插件式的,也就是说,可以指定多种数据库引擎,在现在的MySQL中指定的存储引擎是InnoDB。
接下来以一句简单的SQL语言为例,来看看MySQL对于一句语句的执行过程:
SELECT * FROM T WHERE ID=10 ;
连接器
第一步,连接器负责跟客户端建立连接,获取权限,维持和管理连接。
其连接命令大概是:
-h$ip -P$port -u$user -p
- 若用户名与密码正确,连接器火从权限表中获取该账号所拥有的权限,之后的所有操作都基于此时获取的权限;
- 若用户名与密码错误,返回错误提示,客户端程序结束执行;
也就是说,如果在后面权限被修改,在未重新连接时便还是使用之前的权限。
查询缓存
其拿到查询请求之后,先去查询缓存中查看。
查询缓存的结果可能以key(语句)-value(结果)对的形式直接报错在内存中。
若有该缓存,那么直接返回结果;
若没有该缓存,继续执行后序执行阶段;
Tips: 不建议使用缓存,因为在一次表的更新之后其所有查询缓存会清空,缓存命中率极低,在MySQL8.0直接彻底移除了查询缓存功能。
分析器
这一步,要用到编译原理中的词法分析与语法分析。
分析器会先做“词法分析”,识别每个字符串是代表什么;
之后进行“语法分析”,分析是否符合SQL语句的语法。
若不符合语法,那么会返回SQL语句错误的提示。
优化器
优化器的作用:在表内拥有多个索引时,决定使用哪个索引
执行器
执行步骤:
- 先根据权限判断对该表是否有查询权限,若没有则返回无权限错误;
- 若有权限,打开表继续执行,打开表先根据执行引擎定义,调用引擎提供的接口;
- 若ID字段没有索引,调用引擎接口取该表第一行,判断ID是否为10,若否则跳过,是则存在结果集中;调用接口取“下一行”,重复上一步,直到最后一行;将结果集返回客户端;
- 若ID字段有索引,也是类似的,不过取得是“满足条件的第一行”。
小结
其实与普通的编译器过程类似,也有编译的过程:语法分析,词法分析,优化;独特的就是其连接器与权限查询,该篇只是为执行查询语句的过程有个粗略的认识,在之后会有更为深入的解读。