一、MySQL基架
MySQL基架大致包括如下几大模块组件:
1.MySQL向外提供的交互接口(Connectors):Connectors组件,是MySQL向外提供的交互组件,如java,.net,php等语言可以通过该组件来操作SQL语句,实现与SQL的交互。
2.管理服务组件和工具组件(Management Service & Utilities):提供对MySQL的集成管理,如备份(Backup),恢复(Recovery),安全管理(Security)等。
3.连接池组件(Connection Pool):负责监听对客户端向MySQL Server端的各种请求,接收请求,转发请求到目标模块。
每个成功连接MySQL Server的客户请求都会被创建或分配一个线程,该线程负责客户端与MySQL Server端的通信,接收客户端发送的命令,传递服务端的结果信息等。
4.SQL接口组件(SQL Interface):接收用户SQL命令,如DML,DDL和存储过程等,并将最终结果返回给用户。
5.查询分析器组件(Parser):首先分析SQL命令语法的合法性,并尝试将SQL命令分解成数据结构,若分解失败,则提示SQL语句不合理。
6.优化器组件(Optimizer):对SQL命令按照标准流程进行优化分析。
7.缓存主件(Caches & Buffers):缓存和缓冲组件
8.插件式存储引擎(Pluggable Storage Engines)
9.物理文件(File System)
二、四层结构
1、网络接入层
主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是MySQL所特有的技术。
TCP/IP(传输控制协议/Internet 协议,Transmission Control Protocol/Internet Protocol):该通信协议套件用于连接 Internet 上的主机。在 Linux 操作系统中,TCP/IP 是内置的,供 Internet 使用,从而使其成为通过网络传输数据的标准。这是适用于 Windows 的最佳连接类型。
UNIX 套接字:一种进程间通信形式,用于在同一台计算机上的程之间形成双向通信链路的一端。套接字需要本地系统上的物理文件,这是适用于 Linux 的最佳连接类型。
共享内存:一种在程序之间传递数据的有效方式。一个程序创建其他进程(如果允许)可以访问的内存部分。此 Windows 显式“被动”模式仅适用于单台 (Windows) 计算机。默认情况下,共享内存处于禁用状态。要启用共享内存连接,必须使用–shared-memory 选项启动服务器。
命名管道:命名管道的使用偏向于客户机/服务器通信,其工作方式与套接字非常相似。命名管道支持读/写操作,以及服务器应用程序的显式“被动”模式。此协议仅适用于单台 (Windows) 计算机。默认情况下,命名管道处于禁用状态。要启用命名管道连接,必须使用 --enable-named-pipe 选项启动服务器。
2、服务层(核心层)
MySQL的核心服务层都在这一层,查询解析,SQL执行计划分析,SQL执行计划优化,查询缓存。以及跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。通过下图来观察服务层的内部结构:
查询缓存:在解析查询之前,服务器会检查查询缓存,如果能找到对应的查询,服务器不必进行查询解析、优化和执行的过程,直接返回缓存中的结果集。
解析器与预处理器:MySQL会解析查询,并创建了一个内部数据结构(解析树)。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理会根据MySQL的规则进一步检查解析树是否合法。比如要查询的数据表和数据列是否存在等。
查询优化器:优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。优化器并不关心使用的什么存储引擎,但是存储引擎对优化查询是有影响的。优化器要求存储引擎提供容量或某个具体操作的开销信息来评估执行时间。
查询引擎:在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令调用存储引擎的接口得出结果。
3、存储引擎层
负责MySQL中数据的存储与提取。 服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。如果对于存储引擎的性能不满意,可以通过修改源码来得到自己想要达到的性能。
特点:
存储引擎是针对于表的而不是针对库的(一个库中不同表可以使用不同的存储引擎),服务器通过API与存储引擎进行通信,用来屏蔽不同存储引擎之间的差异。
4、系统文件层
该层主要是将数据库的数据存储在文件系统之上,并完成与存储引擎的交互。