文章目录
MySQL 架构
1. MySQL 中包含的模块
-
服务器初始化模块
服务器初始化模块
负责在启动时完成服务器初始化。 -
连接管理器
连接管理器
侦听来自客户端的连接,然后将请求发给线程管理器
。 -
线程管理器
线程管理器
负责跟踪线程,确保分配线程,以处理来自客户端的连接 -
连接线程
连接线程
是在一个已建立的连接上处理客户端请求的工作核心 -
用户验证模块
用户验证模块
验证所连接的用户,并对包含该用户层权限信息的结构和变量进行初始化。 -
访问控制模块
访问控制模块
检验客户端用户是否有足够的权限来执行所请求的操作。 -
解析器
解析器
负责解析查询,并生成解析树。 -
命令调度器
命令调度器
负责将请求转发给知道处理这些请求的低层次模块 -
查询高速缓存模块
查询高速缓存模块
高速缓存查询结果,并在可能的时候通过提交高速缓存结果尝试短路查询的执行。 -
优化器
优化器
负责创建回答查询的最佳策略,并执行该策略,向客户端提交结果。 -
表管理器
表管理器
负责创建、读取、修改表定义文件,维护表描述符高速缓存,以及管理表锁。 -
表修改模块
表修改模块
负责表创建、删除、重命名、移除、更新或插入之类的操作。 -
表维护模块
表维护模块
负责表维护操作。(检查、修理、备份、恢复、优化(碎片整理)及解析) -
状态报告模块
状态报告模块
负责回答关于服务器配置设置、性能追踪变量、表结构信息、复制进度、表高速缓存状态等的查询。 -
抽象存储引擎接口(表处理器)
抽象存储引擎接口
模块实际上是一个名为 handle 的抽象类和一个名为 handlerton 的结构,提供了执行低层次存储与检索操作的标准化接口。 -
存储引擎的实现(MyISAM,InnoDB,MEMORY)
存储引擎
实现了handle 接口 -
日志记录模块
日志记录模块
负责维护较高层次的(逻辑)日志。逻辑日志
:- 二进制更新日志(大多数时用于复制)
- 命令日志(大多数用于服务器监视和应用程序调试)
- 缓慢查询日志(用于跟踪优化慢查询)
-
主复制服务器模块
主复制服务器模块
负责实现主服务器上的复制功能,根据请求不断向服务器发送复制日志(binlog)事件。MySQL复制的工作原理就是通过 binlog日志来实现的
-
从复制服务器模块
从服务器复制模块
负责实现从服务器上的复制功能,从主服务器处检索更新,并将这些更新同步到从服务器上 -
客户端、服务器协议API
客户端、服务器协议API
模块实现在整个服务器中使用的API,以创建、读取、解释和发送协议包。 -
低层次网络 I/O API
低层次网络 I/O API
提供低层次网络 I/O 和 SSL会话的抽象 -
核心API
核心API
提供了用于可移植的文件 I/O ,内存管理、字符串操作、文件系统导航、格式化打印、丰富的数据结构和算法集等。
2. 核心模块间的交互
当通过命令行启动服务器
时,
初始化模块
解析配置文件和命令行参数,分配全局存储缓冲区、初始化全局变量和结构、加载访问控制表及执行大量的其他初始化任务。完成后将控制权交给连接管理器
连接管理器
开始侦听来自回路中的客户端的连接,当客户端连接到数据库服务器时,连接管理器执行大量低层次网络协议任务,然后将控制权传递给线程管理器
线程管理器
提供一个线程(连接线程),用于处理连接。首先会先调用用户验证模块
(验证用户的证书),验证通过后,客户端则可以发出请求。
连接线程将请求数据传递给命令调度器
(简单的命令直接被命令调度器接纳,复杂的转发给其他模块)
命令可以请求服务器运行查询,更改数据库,报告状态,发送复制更新的连续转储,关闭连接等操作。
MySQL 中又两种类型的客户端请求:
查询
任何查询必须通过解析器的请求。(SELECT,DELETE,INSERT 都是查询)
SQL语句就是查询
命令
命令无需调用解析器即可执行的请求。
命令调度器
通过查询高速缓存模块
将查询发送给解析器
。
高速缓存模块
检查是否存在一个可用、有效的缓存。如果有的话,直接返回缓存结果,没有的话,将查询发送给解析器
处理
解析器
根据查询类型决定如何传送控制权
查询类型控制权的选择:
- 优化器:选择查询命令发送给优化器;
- 表修改模块:更新,插入,删除及表创建等查询
- 表维护模块:检查、维修、更新键统计或整理表(碎片)的查询
- 复制模块:复制相关的查询
- 状态报告模块:状态请求
各个模块在接收到解释器
传递来的控制权后,都将参与查询的表传递给访问控制模块
,权限校验成功后,再传递给表管理器
,表管理器
打开各个表,取出所需要的锁。表操作模块
准备继续执行其特定任务,向抽象存储引擎模块
发出大量请求,要求执行各种低层次操作。(如插入或更新记录,根据键值检索记录,或执行表层次上的操作,如修复表或更新索引)
3. 解析器和优化器
MySQL服务器
接收SQL
格式的查询,当接收到查询时,首先对查询进行解析,包括将文本格式
转化为内部二进制结构组合
。方便优化器
轻松处理。
解析器生成的解析树必须以某种方式为优化器提供信息
优化器
选取表连接顺序和读取记录的方法,以及要使用的键。(尽可能快的提供查询结果)
3.1 解析器
解析器
由两部分组成:
句法扫描器
语法规则模块
句法扫描器
将整个查询分解为多个令牌(一些不可分割的元素,例如列名称
),同时语法规则模块
找到一个SQL语法规则组合,该组合产生这一序列,并执行与这些规则相关的代码。最后产生一棵解析树,供优化器
使用
3.1.1 解析器:句法扫描器
句法扫描器
检查查询字符流,将其分解为令牌,然后识别每个令牌。
识别令牌:将每个令牌标记为一个关键字,一个函数名称。或一些语法规则中包含某种意义的特殊符号
3.1.2 解析器:语法规则模块
语法规则模块
按照一系列规则与令牌流相匹配,然后找出正确的规则;最终的执行结果是解析树,通过这种结构能有效的存储用于执行每个可能使用的SQL语句所需要的信息。
3.2 优化器
MySQL优化器所具有的重要功能:
-
确定使用哪个键从表中获取记录,并选择最适合该表的键
-
针对每个表确定扫描表是否比读取键更好(如果有很多记录与键值匹配,则键的优点下降,表扫描更快)
重复的键值:某一列存在大量重复的值
-
当查询中出现一个以上的表时,确定表的连接顺序
-
重写 WHERE 从句(删除死代码,减少不必要的计算)
-
从连接中删除未使用的表
-
试着使用一个内部连接替换一个外部连接
-
试着简化子查询
-
合并视图(扩大视图引用,使其成为一个宏)
3.2.1 子查询优化
- 能够高速缓存返回多个记录的一个子查询结果,并使用他们。而不是对每个记录组合执行子查询
- 能够在存储FROM从句子查询结果的临时表中创建和使用合适的键
- 能够在存储WHERE从句子查询结果的临时表中创建和使用合适的键
- 支持独立的FROM从句子查询
- 能在子查询优化期间重写连接顺序
- 能使用涉及相同表的子查询以 UPDATE/INSERT/DELETE 修改表
4. 存储引擎
MyISAM | InnoDB | Memory | |
---|---|---|---|
事务 | 否 | 是 | 否 |
索引 | B 树,R树,纯文本 | B 树 | 散列B 树 |
存储 | 本地磁盘 | 本地磁盘 | RAM |
锁定 | 表 | 行 | 表 |
外键 | 否 | 是 | 否 |
Memory 存储引擎
即以前的HEAP,将数据存储在内存中。
5. InnoDB的死锁检测
InnoDB
具有一种死锁检测算法,在放入一个新锁时,InnoDB
确定它没有引起死锁。当发现死锁时,将回滚一个有疑问的事务,但是,死锁检测算法只知道InnoDB
锁,当某些问题锁不属于 InnoDB
时,则无法检测死锁。为了解决这个问题,InnoDB
还使用了超时死锁检测,将回滚耗时较长的事务。
6. MySQL 的逻辑架构
MySQL按照逻辑分层的情况下,可以分为四层
- 网络连接层
- 服务层
- 引擎层
- 存储层
6.1. 网络连接层
6.1.1. 客户端连接器
提供与MySQL服务器建立的支持。目前几乎支持所有主流 的服务端编程技术,例如常见的 Java、C、Python、.NET等,它们通过各自API技术与MySQL建立连接。
6.1.2. 用户鉴权
当客户端向MySQL服务端发起连接请求后,MySQL server会对发起连接的用户进行鉴权处理,MySQL鉴权依据是: 用户名,客户端主机地址和用户密码
6.1.3. 安全管理
当客户连接到MySQL server后,MySQL server会根据用户的权限来判断用户具体可执行哪些操作
6.2. 服务层
服务层是MYSQL Server 的核心,主要包含系统管理和控制工具、连接池、SQL 接口、解析器、查询优化器和缓存六个部分
6.2.1. 连接池
负责存储和管理客户端与数据库的连接,一个线程负责管理一个连接,
6.2.2. 系统管理和控制工具
备份恢复,安全管理,集群管理
6.2.3. SQL 接口
用于接收客户端发送的各种SQL 命令,并且返回用户需要查询的结果。(DML,DDL,存储过程,视图,触发器)
6.2.4. 解析器
负责将请求的SQL解析生成一个“解析器”。然后根据一些MQSQL规则进一步检查解析树是否合法。
6.2.5. 查询优化器
当“解析树”通过解析器语法检查后,将交由优化器转化成执行计划,然后与存储引擎交互。
6.2.6. 缓存
缓存机制是由一系列小缓存组成的,比如表缓存,记录缓存,权限缓存,引擎缓存。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
6.3. 存储引擎层
存储引擎负责MYSQL中数据的存储与提取,与底层系统文件进行交互。MYSQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异。
现在有很多种存储引擎,各有各的特点,最常见的是MYISAM和INNODB。
6.4. 文件系统层
负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid文件,socket文件等。
参考文献:《深入理解MySQL核心技术》