X Tutup
Skip to content

Latest commit

 

History

History
118 lines (66 loc) · 6 KB

File metadata and controls

118 lines (66 loc) · 6 KB

MySQL架构介绍

thegeeksearch.com

和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

下边是 MySQL 官网中 8.0 版本的一个图,我们展开看一下,对 MySQL 整体架构和可插拔的存储引擎先有个总体回顾。

https://dev.mysql.com/doc/refman/8.0/en/pluggable-storage-overview.html

1. 连接层

要使用 MySQL,第一步肯定要与他进行连接。

最上层就是一些客户端和连接服务,包含本地 socket 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于建立连接、授权认证、及相关的安全方案

2. 服务层

第二层架构完成了大部分的核心功能, 包括查询解析、优化、缓存、以及所有的内置函数,所有跨存储引擎的功能也都在这一层实现,包括触发器、存储过程、视图等

查询缓存

第一步的连接建立后,我们就可以使用了。

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

为对一个表的更新,就会把该表上的所有查询缓存清空,所以不建议使用,官方已经在 8.0 版本移除该功能了。

Note

The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.

分析器

如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。

分析器先会做“词法分析”,词法分析完后就要做“语法分析”

根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒

优化器

  • 经过了分析器,MySQL就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。
  • 比如重写查询、决定表的读取顺序,选择合适的索引等

比如你执行下面这样的语句,这个语句是执行两个表的join:

select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;`
  • 既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20。
  • 也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

执行器

  • MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。
  • 开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误
  • 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
select * from T where ID=10;

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

  1. 调用 InnoDB 引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
  • 至此,这个整个语句就执行完成了。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。

SQL 接口

用于接收客户端发送的各种 SQL 命令,返回用户需要查询的结果,比如 DML、DDL、存储过程、视图、触发器这些

3. 引擎层

存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。

不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

4. 存储层

数据存储层,主要是将数据存储在运行于该设备的文件系统之上,并完成与存储引擎的交互。

更符合程序员审美的 MySQL 服务器逻辑架构图

MySQL 的查询流程大致是?

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

  1. MySQL 客户端通过协议与 MySQL 服务器建连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析
  2. 有一系列预处理,比如检查语句是否写正确了,然后是查询优化(比如是否使用索引扫描,如果是一个不可能的条件,则提前终止),生成查询计划,然后查询引擎启动,开始执行查询,从底层存储引擎调用 API 获取数据,最后返回给客户端。怎么存数据、怎么取数据,都与存储引擎有关。
  3. 然后,MySQL 默认使用的 BTREE 索引,并且一个大方向是,无论怎么折腾 sql,至少在目前来说,MySQL 最多只用到表中的一个索引。

Reference

  • 《高性能 MySQL》
  • 《MySQL 实战 45 讲》
X Tutup