我们要学好mysql必须要了解其中都有哪些模块,并且对模块功能要非常清楚,举一反三知道其中原理。

下面是mysql的模块图

可以看到, MySQL 的架构共分为两层:Server 层和存储引擎层,

Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,
主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。
另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)
都在 Server 层实现。

存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,
不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始,
InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,
不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,
也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

1. 连接器


负责建立连接,权限验证

2.查询缓存


负责缓存查询出来的数据,通过查询语句作为key来进行match 一旦多次查询相同内容将会立刻返回内容。8.0以后就删除了这个功能,因为很鸡肋,频繁更新表都会导致缓存被清空。

3.解释器


负责对查询语句进行 词法分析和语法分析

  • 词法分析

    • 根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。
  • 语法分析

    • 根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。

如果这里分析出来语法不对就会报错

但是注意,表不存在或者字段不存在,并不是在解析器里做的,《MySQL 45 讲》说是在解析器做的,但是经过我和朋友看 MySQL 源码(5.7和8.0)得出结论是解析器只负责检查语法和构建语法树,但是不会去查表或者字段存不存在。

4. 预处理器


经过解析器后,接着就要进入执行 SQL 查询语句的流程了,每条SELECT 查询语句流程主要可以分为下面这三个阶段:

  • prepare 阶段,也就是预处理阶段;
  • optimize 阶段,也就是优化阶段;
  • execute 阶段,也就是执行阶段;

预处理阶段

用来判断表是否存在,表字段是否存在检查

5.优化器


经过预处理阶段后,还需要为 SQL 查询语句先制定一个执行计划,这个工作交由「优化器」来完成的。

优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。

当然,我们本次的查询语句(select * from product where id = 1)很简单,就是选择使用主键索引。

要想知道优化器选择了哪个索引,我们可以在查询语句最前面加个 explain 命令,这样就会输出这条 SQL 语句的执行计划,然后执行计划中的 key 就表示执行过程中使用了哪个索引,比如下图的 key 为 PRIMARY 就是使用了主键索引。

执行计划

6.执行器


经历完优化器后,就确定了执行方案,接下来 MySQL 就真正开始执行语句了,
这个工作是由「执行器」完成的。在执行的过程中,执行器就会和存储引擎交互了,
交互是以记录为单位的。