前面三篇文章我们一起分析了外部环境对 MySQL 性能的影响,不过起决定作用的还是 MySQL 自身,今天我们就来看看 MySQL 体系架构,看看这个数据库到底是怎么组成的。
MySQL 是一个典型的 C/S 架构应用程序,MySQL Server 提供数据库服务,完成客户端的请求和操作,Client 则负责连接到 Server。很多初学者并不太容易区分出 MySQL Server 和 Client,因为当我们安装完 MySQL 之后,默认情况下 Server 和 Client 就都具备了,我们在命令行连接并登录 MySQL 服务,这个其实就是由 Client 提供的服务。MySQL 和其他关系型数据库不一样的地方在于它的弹性以及可以通过插件形式提供不同种类的存储引擎,MySQL 请求处理过程会根据不同的存储引擎发生变化,这是它的特色。
1.MySQL 存储引擎
这里我主要和大家介绍下 MySQL 存储引擎的历史,至于每一个存储引擎的特点,松哥将在后面的文章中和大家详细介绍。
MySQL 从设计之初,存储引擎就是可插拔的,允许公司或者个人按照自己的需求定义自己的存储引擎(当然,普通的公司或者个人其实是没有这个实力的)。MySQL 自研的使用较广的存储引擎是 MyISAM ,MyISAM 支持表锁,不支持行锁,所以在处理高并发写操作时效率要低一些,另外 MyISAM 也不支持外键(虽然现在实际项目中外键已经用的比较少了)。
虽然 MyISAM 看起来有些简陋,但这并不影响 MySQL 的流行,这就不得不说 MySQL 中另外一个大名鼎鼎的存储引擎 InnoDB 了。
InnoDB 存储引擎是由一家位于芬兰赫尔辛基的名为 Innobase Oy 的公司开发的,InnoDB 存储引擎的历史甚至比 MySQL 还要悠久。可能会有小伙伴决定奇怪,插件竟然比起宿主还要历史悠久?
后来 MySQL2.0 推出后,这种可插拔的存储引擎吸引了 Innobase Oy 公司创始人 Heikki Tuuri 的注意,在和 MySQL 沟通之后,决定将 InnoDB 作为一个存储引擎引入到 MySQL 中(这就是为什么 InnoDB 比 MySQL 还历史悠久的原因),MySQL 虽然支持 InnoDB ,但是实际上还是主推自家的 MyISAM。
这是我们对 MySQL 存储引擎的一个简略介绍,后面松哥会专门写文章来详细介绍每一种存储引擎的特点,欢迎大家一起来讨论。
2.MySQL 架构
接下来我们再来看看 MySQL 的软件架构(图片源自网络)。
从上图我们可以大概看出来,MySQL 架构大致上可以分为三层:
客户端(应用层)
服务层
存储引擎层
我们分别来看。
2.1 客户端
基本上所有的 C/S 架构的程序都有一个客户端层,这一层主要包含如下三方面的内容:
连接处理:当一个客户端向服务端发送连接请求后,MySQL Server 会从线程池中分配一个线程来和客户端进行连接,以后该客户端的请求都会被分配到该线程上。MySQL Server 为了提高性能,提供了线程池,减少了创建线程和释放线程所花费的时间。主流的程序设计语言都可以使用各自的 API 来与 MySQL 建立连接。
用户认证:当客户端向 MySQL 服务端发起连接请求后,MySQL Server 会对发起连接的用户进行认证处理,MySQL 认证依据是: 用户名,客户端主机地址和用户密码。
用户鉴权:当客户连接到 MySQL Server 后,MySQL Server 会根据用户的权限来判断用户具体可执行哪些操作。
2.2 服务层
MySQL 服务层的东西主要有六方面,我们来逐个分析。
2.2.1 系统管理和控制工具
数据库备份和恢复
数据库安全管理,如用户及权限管理
数据库复制管理
数据库集群管理
数据库分区,分库,分表管理
数据库元数据管理
2.2.2 连接池
这个前面已经提到过,连接池负责存储和管理客户端与数据库的连接,一个线程管理一个连接。
2.2.3 SQL 接口
SQL 接口用来接受客户端发送来的各种 SQL 命令,并且返回用户需要的查询结果。
如:
DDL
DML
存储过程
视图
触发器
等都在这里被处理。
2.2.4 解析器
解析器的作用主要是解析查询语句,将客户端请求的 SQL 解析生成一个“解析树”,然后根据 MySQL 的语法规则检查解析树是否合法,如果语句语法有错误,则返回相应的错误信息。