章节中会介绍MySQL所使用的客户/服务器模型。你会了解:
- 对MySQL C/S模式的描述
- 理解通信协议(Communication Protocols)
- 理解服务器如何支持存储引擎
- 关于MySQL如何使用内存和磁盘空间的基础知识
2.1 MySQL架构概览
MySQL架构实际上是一组为了完成数据库服务器任务而协同工作的相关功能组合。这些功能集包含超过50,0000行代码。下图中对其中的功能子系统进行了分层展示,层级之间通过相应API进行交互。多数情况下,每个子系统会对信息进行接收,处理然后再传送给下一个子系统以完成所分配的任务。子系统之间相对独立,这样就会有更大的自由度(如由于执行语句的存储引擎独立性,客户端不必知道哪个存储引擎执行其请求)。
2.1.1 核心共享子系统(Core Shared Subsystems)
在MySQL中的每个子系统都能自成一章。由于篇幅所限,这里仅对每个核心共享子系统进行简单描述,以给大家对其性能特点有一个概括性理解。
进程,线程和资源管理器(Process, Thread and Resource Management):
MySQL使用了一个基于线程的服务器架构,允许各种执行线程(或称为轻量级进程)访问核心共享资源。MySQL这种的多线程单进程架构能保证多个执行线程之间不会相互冲突或覆盖重要数据。使用基于线程的服务器架构最值得注意的优点是:
- 节约成本 – 和进程相比,线程的建立和销毁成本更低。新的线程可使用其父进程的地址空间而不需要额外的地址空间。
- 切换代价低 – 由于线程运行于相同的服务器进程空间中, 因此线程之间的切换代价很小。
- 极小的开销 – 由于线程可对父进程地址空间进行访问,因此在共享资源下开销也变得极小。
缓存(Cache/Buffer)管理:
此子系统专注于缓冲并取回服务器进程中所有线程执行所用的大量数据类型。由于已经将返回的数据进行内存缓存,因此数据缓存使得MySQL可以降低大量对于基于磁盘I/O代价昂贵的操作。
网络管理(Networking Management):
此子系统的职责是通过处理在多平台间发送和接收带有MySQL连接请求和命令的网络数据包这样的工作,使得各种通信协议(TCP/IP, 命名管道Named Pipes等)对连接线程变得透明。它也包括了处理安全套接字层(Secured Socket Layers: SSL)这样的工作。
日志管理:
这个子系统是为了将各种日志事件子类被维护在一个日志类下而建立的。这样能使得开发者能在不破坏系统核心功能的情况下增加日志和日志事件。通过对日志系统中子系统的区分。各种系统活动(启动,多语句事务,自动增量auto-increment值改变等)就可以通过子类事件进行记录。
访问及授权管理:
此子系统定义了所有为执行命令所需的GRANT权限并主要用于保证客户端和服务器间的安全。它会验证用户在登陆过程中的访问权限及查询权限。此子系统也包含了一些对授权表的内存版本修改功能及密码生成功能。
2.1.2 存储引擎接口(Storage Engine Abstraction)
此子系统使得MySQL可以在系统架构中使用不同的表数据handlers(处理子程序)。尽管不是所有存储引擎都完整实现了相关handler API,但大部分独立的handler API都被用于转换数据、schema和索引格式,以使其符合MySQL内部记录格式所需(内存记录格式)。
2.1.3 查询解析,优化和执行
由于这些子系统负责接收SQL语句,将语句解构为各种数据结构并以最佳路径进行执行,因此它们被称为MySQL服务器的大脑。
- 查询解析:
这是一个将SQL语句解析为一个抽象语法的过程。由于此过程非常复杂,因此解析时不能对任何用户变量进行改变。
- 优化:
此子系统负责找到查询的最优执行计划。
- 执行:
此子系统又被称为语句执行单元,负责按照通过SQL命令解析和优化后所得的最优执行路径进行执行。执行进程的基本功能是都有一个指针作为其第一参数以将结构数据包发回给客户端。
2.1.4 查询缓存(Query Cache)
不像其它MySQL子系统,此“子系统”组件由一系列类组成。它不仅负责缓存被执行的SQL命令,还存储命令执行后的结果。
Comment