MySQL体系结构
MySQL 使用典型的客户端/服务器(Client/Server)结构,架构如下所示:
MySQL 体系结构大体可以分为三层:客户端、服务器层、存储引擎层、系统文件层。其中,服务器层又包括了连接管理、SQL 接口、解析器、优化器、缓冲与缓存以及各种管理工具与服务等。
具体来说,每个组件的作用如下:
- 客户端,连接 MySQL 服务器的各种工具和应用程序。例如 mysql 命令行工具、mysqladmin 以及各种驱动程序等。
- 连接管理(connection Pool),负责监听和管理客户端的连接以及线程处理等。每一个连接到 MySQL 服务器的请求都会被分配一个连接线程。连接线程负责与客户端的通信,接受客户端发送的命令并且返回服务器处理的结果。
- SQL 接口(SQL Interface),接收客户端发送的各种 DML和 DDL 命令,并且返回用户查询的结果。另外还包括所有的内置函数(日期、时间、数学以及加密函数)和跨存储引擎的功能,例如存储过程、触发器、视图等。
- 解析器(Parser),对 SQL 语句进行解析,例如语义和语法的分析和检查,以及对象访问权限检查等。
- 优化器(Optimizer),利用数据库的统计信息决定 SQL 语句的最佳执行方式。使用索引还是全表扫描的方式访问单个表,多表连接的实现方式等。优化器是决定查询性能的关键组件,而数据库的统计信息是优化器判断的基础。
- 缓存与缓冲(Caches&Buffers),由一系列缓存组成的,如查询缓存,表缓存、索引缓存以及对象权限缓存等。对于已经访问过的磁盘数据,在缓冲区中进行缓存;下次访问时可以直接读取内存中的数据,从而减少磁盘 IO。通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。
- 存储引擎(Parser),存储引擎是对底层物理数据执行实际操作的组件,为服务器层提供各种操作数据的 API。MySQL 支持插件式的存储引擎,包括 InnoDB、MyISAM、Memory 等。
- 管理服务和工具,MySQL 提供的系统管理和控制工具,例如备份与恢复、复制、集群等。
- 物理文件,所有数据最终都是存储磁盘的文件,物理文件主要包括redo日志文件,undo日志文件,data文件,index文件,binlog日志文件,error日志文件,Query日志文件,Slow日志文件等。
Select语句执行过程
主流程如下:
1)MySQL客户端对MySQL服务端的监听端口发起请求。
2)在连接者组件层创建连接,分配连接,并且验证用户名,密码和库表权限。
3)如果有打开查询缓存,如果能找到对应的查询,服务器不必进行查询解析、优化和执行的过程,直接返回缓存中的结果集;没有查询到继续往下执行。
4)解析器接收SQL语句,将SQL语句分解成数据结构及解析树(将SQL语句解析成MySQL认识的语法)。
5)查询优化器组件生成查询路径树(及执行计划),并且选择一条最优的查询路径。
6)调用存储引擎接口,打开表,执行查询,检查存储引擎缓存中是否有对应缓存记录,如果没有就继续往下执行。
7)到磁盘物理文件中寻找数据。
8)当查询到所需要的数据后,先写入存储引擎缓存中,如果打开了查询缓存也会同时写进去。
9)返回数据给客户端。
10)关闭表。
11)关闭线程。
12)关闭连接。
- 查询缓存
在解析查询之前,服务器会检查查询缓存,如果能找到对应的查询,服务器不必进行查询解析、优化和执行的过程,直接返回缓存中的结果集。
- 解析器与预处理器
MySQL会解析查询,并创建了一个内部数据结构(解析树)。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理会根据MySQL的规则进一步检查解析树是否合法。比如要查询的数据表和数据列是否存在等。
- 查询优化器
优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后返回相应的结果。优化器的作用就是找到这其中最好的执行计划。优化器并不关心使用的什么存储引擎,但是存储引擎对优化查询是有影响的。优化器要求存储引擎提供容量或某个具体操作的开销信息来评估执行时间。
- 查询执行引擎
在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令调用存储引擎的接口得出结果。