mysql 系列:总体架构概述
前言
使用 mysql 很多年了,但也没怎么深入研究过,准备最近了解下 mysql 的相关知识点。看看这款程序界里的神器是怎么运转的。
mysql 的架构模式
mysql 采用的是 C/S 架构,也就是我们平常所说的客户端-服务器模型。像我们平常所用的 workbench、nacivat 就是客户端,当然,还有命令行工具。
它们会根据指定的 ip、prot 连到服务器,通过一定的协议来进行 SQL 的执行。这些协议包括最广泛使用的 TCP 协议,也包括了适用于本地通信的套接字、共享内存、命名管道等。
mysql 的每一次连接在服务端都有一个专门的线程来管理,并且采用的网络 IO 模型是 select/poll,并非 epoll。
主要是因为 select/poll 可移植性好,很多系统都支持。而且 mysql 的瓶颈不在于网络连接上,对于连接数少,并且连接都很活跃的 mysql 而言,select/poll 是更好的选择。
(注:select、poll、epoll 是 IO 多路复用模型,能同时监听多个 I/O 事件的状态,占用资源少,性能高。)
mysql 的 2 个阶段
当服务器接收到客户端的请求连接后,将会进入连接阶段和命令阶段。
连接阶段主要执行了以下任务:
-
确定客户端和服务器当前的版本功能; -
确定是否需要进行 SSL 通信; -
服务端进行客户端的身份认证;
当上面的连接阶段 ok 后,将会进入命令阶段,我们平常所见的 SQL 操作就是在这个阶段执行的,如
-
COM_QUERY
:用于向服务器发送一个立即执行的 SQL 查询 -
COM_CREATE_DB
:用于创建数据库的命令
mysql 的 3 层架构
上面的 2 个阶段是从 mysql 的连接生命周期来划分的,实际从逻辑架构上,mysql 可以划分为 3 层:
-
连接层
:主要负责连接池、通信协议、认证授权等; -
SQL 层
:这一层是 mysql 的大脑,通过一系列组件得到数据操作的最优解。 -
存储层
:负责数据的存储、检索。
SQL 层
前面已经大体介绍过连接层了, 我们来看看 SQL 层,当接收到命令后,mysql 并不会傻乎乎的直接去拿数据,而是会分析当前 sql 语句的各种执行效率,进而获得一个最优的执行计划。
在 SQL 层主要分为了下面几个功能:
-
Query cache
:缓存查询结果集,并且下次的查询命中了缓存,那么会跳过后面的执行,直接返回缓存结果。 -
Parser
:解析器,根据 SQL 语句构建内部使用的解析树,用于方便获取 SQL 信息,如 SQL 的语义和语法信息。 -
Optimizer
:优化器,通过分析存储引擎的操作成本以及表的统计信息,输出高效的执行计划。比如在查询分析中,表扫描或索引扫描哪个执行效率高,则选择哪个。
除了上面功能外,mysql 的内置函数、存储过程、触发器、视图也是在这一层实现的。
存储层
前面提到过优化器会输出执行计划,而具体的实施则是在存储层这一块。存储层在 mysql 这里设计成了可插播的插件,也就是说只要符合了标准化接口(API),那么就可以实现属于自己的一个存储引擎。
存储引擎是用来存储、检索数据的,不同的存储引擎有不同的特性,像 InnoDB 支持事务、外键,而 MyISAM 就不支持。
一般我们不需要关心 SQL 语句会涉及到哪些存储引擎,就像前面提到过的,已经通过标准化接口抽象出来了。只是优化器这一层可能需要根据不同的存储引擎做出不同的选择。
总结
mysql 的总体架构就如上所述了,实际上,mysql 还有很多的重要知识点需要掌握,像锁的机制
,MVCC 版本控制
,查询优化
等,掌握了这些,才算对 mysql 有一个总体认识,后面会继续研究,分享给大伙!