IE盒子

帖子
查看: 182|回复: 2

MySQL基本架构

[复制链接]

4

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-9-23 17:25:46 | 显示全部楼层 |阅读模式
1. 说明

本文及后面的几篇 MySQL 相关笔记总结是本人在极客时间专栏「MySQL 实战45讲」和掘金小册「MySQL 是怎样运行的:从根儿上理解 MySQL」的学习笔记整理,并参考了其他材料,还有一些个人的理解和思考,若有不正之处敬请指正。
顺便推荐一下这两个专栏。
2. 基本架构

MySQL 基本架构示意图如下:



MySQL基本架构【来自极客时间】

MySQL 从整体来说还是 CS 架构,也就是由客户端(Client)和服务器端(Server)两大部分构成。这里主要分析服务器端架构。
服务器端大体可以分为两部分:Server 层和存储引擎层(二者的功能跟日常开发中的 Service 层和与 DAO 层的关系有点像,可以对比理解)。
2.1 Server 层

主要包括连接器(Connector)、查询缓存(Cache)、分析器(Parser)、优化器(Optimizer)和执行器(Executor)等。
该部分包含了 MySQL 的大部分核心功能以及所有的内置函数(日期、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,例如存储过程、触发器等。
下面简要介绍各个部分的功能。
2.1.1 连接器

主要功能:跟 MySQL 客户端建立(TCP)连接、获取权限、维持和管理连接。
若用户认证通过,连接器会查询权限列表获取该用户的权限,之后这个连接的权限都据此来判断。
因此,一个用户建立连接后,即使被修改了权限也不会影响已存在连接的权限,只有重新建立连接后才生效。
客户端建立连接示例:

  • 连接失败
# 连接失败(密码错误)
$ mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

  • 连接成功
# 连接成功
$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.19 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>这些连接的处理和错误提示就是「连接器」来处理的。

  • 查看连接状态
成功连接 MySQL 之后,可以用如下命令查看连接的状态:
# 查看连接状态
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  6 | root | localhost | NULL | Sleep   |   81 |          | NULL             |
|  7 | root | localhost | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)PS: 连接成功后是有超时时间的,若太长时间没有操作连接会断开,默认 8 小时,由参数 wait_timeout 控制。
2.1.2 查询缓存

主要功能:缓存查询结果。
连接建立之后,就可以执行查询操作了。
在一个查询语句中,会先到缓存中查看之前是否查询过这条语句(如果开启了查询缓存功能):若存在则直接返回缓存的结果;否则继续执行后面的流程。
PS: 这个处理流程可以类比我们在开发中使用 Redis 等作为缓存的操作,即先查缓存,再查 DB。
也可以通过使用 SQL_CACHE 显式指定使用查询缓存,例如:
SELECT SQL_CACHE * FROM t1 WHERE id=10;

  • 查询缓存的优缺点
优点:查询命中缓存时效率很高。
缺点:缓存失效非常频繁,只要有对一个表的更新,该表所有的查询缓存都会被清空。
由于上述优缺点,可以发现缓存适用于静态表或更新较少的表,对于更新较频繁的表并不适用。值得一提的是,MySQL 8.0 版本已删除了查询缓存功能,可见该功能比较鸡肋,了解即可。
2.1.3 分析器

主要功能:对 SQL 语句进行词法分析和语法分析。
我们从客户端向 MySQL 服务器发送一条 SQL 语句,其实只是一个普通的字符串。MySQL 服务器怎么识别这个字符串是什么东东呢?这就要靠分析器了。
分析器的主要作用包括两部分:

  • 词法分析
    分词操作,我们在客户端发送给 MySQL 的 SQL 语句实质上就是一个字符串,MySQL 需要将其拆分成一个个的分词(语法树)并进行识别,例如识别“SELECT”、“UPDATE”等关键字,将 t1 识别为一张表,将 id 识别为一列等。
  • 语法分析
    拿到词法分析的结果,并根据语法规则判断 SQL 语句是否合法。若语法错误,则会收到如下错误提示:
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ...PS: 前面 JVM 系列专栏中,有篇文章
提到 Javac 编译器也有词法分析和语法分析的操作,这两者看似不相干,其实是类似的。
PPS: 这里再多说一句,学习技术的过程中,会逐渐发现有些看起来似乎没什么联系的东西,它们背后还是有一些相通之处的,这不就是一个栗子 吗?
2.1.4 优化器

主要功能:生成执行计划,选择索引。
经过了分析器之后,MySQL 已经知道了我们提交的 SQL 语句想要做什么。
但是,MySQL 服务器并不认为我们的 SQL 语句是最优的,为了提高执行效率,它并非完全按照我们的 SQL 语句执行,而要进行一系列优化。
例如,多表关联(JOIN)查询时决定表连接的顺序,当表中有多个索引时决定使用哪个索引等等。
PS: 这有点类似 JVM 执行 Java 代码时的操作。
即,JVM 并非完全按照代码的先后顺序来执行的,它会调整一些代码的执行顺序(乱序执行)以提高效率,只是保证最终结果与代码顺序执行的效果一致。
又来一个  
2.1.5 执行器

主要功能:调用存储引擎接口,返回结果。
MySQL 知道了我们要做什么、并且进行了优化,那么接下来就要开始执行了。
执行之前,会判断你对该表是否有「查询」的权限,若有权限则继续执行;否则会返回如下错误(这里以 SELECT 操作为例,其他操作类似):
SELECT command denied to user 'user'@'localhost' for table 't1'为什么到这一步才进行权限检查呢?
是因为有时候 SQL 语句要操作的表不只是 SQL 字面上的那些(例如触发器要在执行过程中才能确定),因此权限检查在这里进行。
2.2 存储引擎层

2.2.1 常见存储引擎

存储引擎(Storage Engine)层主要负责数据的存储和提取,它是直接和磁盘打交道的,以「插件」的形式存在,例如 InnoDB、MyISAM、Memory 等多种存储引擎。
从 MySQL 5.5.5 开始,InnoDB 成为了默认的存储引擎。MySQL 支持的所有存储引擎如下:
# 查看支持的存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)其中:

  • Support 表示该引擎是否可用(DEFAULT 表示默认值);
  • Comment 是描述信息;
  • Transactions 表示是否支持事务;
  • XA 表示是否支持分布式事务;
  • Savepoints 表示是否支持回滚。
  • 常见存储引擎对比
除了 InnoDB 引擎,MyISAM 和 Memory 引擎有时也会遇到,这三种引擎简单对比如下:


其实最常用的还是 InnoDB 引擎,其他的了解即可。
2.2.2 执行流程

以上述 SELECT 语句为例,执行步骤大致如下(这里的 id 不是主键):

  • 调用 InnoDB 引擎接口取 t1 表的第一行,判断 id 是否为 10,若不是则跳过;否则将这一条记录存在结果集中;
  • 调用存储引擎接口读取“下一行”,判断逻辑同步骤 1,直至读取到表的最后一行;
  • 执行器将上述遍历过程中所有满足条件的记录作为结果集返回给客户端。
3. 小结

MySQL 的整体架构主要分为两部分:Server 层和存储引擎层。
为了便于回顾和思考,将本文的主要内容总结为了思维导图如下:


PS: 发现一个现象,许多东西学的时候觉得不难,但是如果自己不去做笔记的话就很容易忘记。因此就需要用自己的语言去表达出来,这样更能促进思考,也能进一步“内化”到自己的知识体系中。
回复

举报

2

主题

6

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-9-23 17:26:20 | 显示全部楼层
赞,很清晰明了[赞]
回复

举报

0

主题

4

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2025-3-24 23:38:44 | 显示全部楼层
珍爱生命,果断回帖。
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表