资源地址:
- MySQL官网:https://www.mysql.com/
- MySQL官网(中文):https://www.mysqlzh.com/
1. 前言
本章目标:
- 了解MySQL体系结构。
- 了解SQL语句的执行过程。
- 了解MySQL的存储引擎。
2. 体系结构
2.1 概念
在数据库领域里很常见的两个词:“数据库”和“数据库实例”。
- “数据库”:数据库是物理操作系统文件或其他形式的文件类型的集合。在 MySQL 中,数据库文件可以是 frm、myd、myi、ibd 结尾的文件。
- “数据库实例”:数据库实例是由数据库后台进程/线程以及一个共享内存区组成。共享内存可以被运行的后台进程/线程所共享。 需要注意的是,数据库实例才是真正用来操作数据库文件的,一个 MySQL 实例管理的是多个数据库。
MySQL被设计成单进程多线程架构的数据库。当启动实例时,MySQL会先去读取配置文件,然后根据配置文件参数来启动数据库实例。配置文件中datadir参数指定了数据库所在的路径。
2.1 逻辑结构
MySQL使用客户端/服务器(Client/Server)结构,逻辑结构图如下所示:
MySQL 体系结构大体可以分为三层:客户端、服务器层以及存储引擎层。
组件说明:
-
连接器(Connectors):提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务端编程技术,例如常见的 Java、C、Python、.NET等,它们通过各自API技术与MySQL建立连接。
-
连接池组件(Connection Pool):进行身份验证、线程重用,连接限制,检查内存,数据缓存;管理用户的连接,线程处理等需要缓存的需求。
-
管理服务和工具组件(Management Serveices & Utilities):备份和恢复的安全性,复制,集群,管理,配置,迁移和元数据。
-
SQL接口组件(SQL Interface):接收各种SQL命令(比如DML、DDL、存储过程、视图、触发器等),并且返回用户需要查询的结果。
-
解析器组件(Parser):负责将请求的SQL解析生成"解析树",然后根据MySQL规则进一步检查解析树是否合法。
-
优化器组件(Optimizer):SQL语句在查询之前会使用查询优化器对查询进行优化。利用数据库的统计信息决定 SQL 语句的最佳执行方式。使用索引还是全表扫描的方式访问单个表,多表连接的实现方式等。优化器是决定查询性能的关键组件,而数据库的统计信息是优化器判断的基础。
-
缓存与缓冲组件(Cache & Buffer): 由一系列缓存组成的,例如数据缓存、索引缓存以及对象权限缓存等。对于已经访问过的磁盘数据,在缓冲区中进行缓存,下次访问时可以直接读取内存中的数据,从而减少磁盘 IO。
-
插件式存储引擎(Engine):负责对底层物理数据执行实际操作,为服务器层提供各种操作数据的 API。MySQL 支持插件式的存储引擎,包括 InnoDB、MyISAM、Memory 等。存储引擎是针对于表的而不是针对库的。
-
系统文件层:负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件、数据文件、配置文件、pid 文件、socket 文件等。
2.2 运行机制
MySQL Server的运行主要分为建立连接、查询缓存、解析器、查询优化器、执行引擎五个部分。
-
建立连接
通过客户端/服务器通信协议与MySQL建立连接。MySQL 客户端与服务端的通信方式是 “ 半双工 ”。对于每一个 MySQL 的连接,时刻都有一个线程状态来标识这个连接正在做什么。使用命令“show processlist;”可以查询线程状态。 -
查询缓存
如果开启了查询缓存且在查询缓存过程中查询到完全相同的SQL语句,服务器不必进行查询解析、优化和执行的过程,直接返回缓存中的结果集。 -
解析器与预处理器
MySQL会解析查询,并创建了一个内部数据结构(解析树)。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理会根据MySQL的规则进一步检查解析树是否合法。比如要查询的数据表和数据列是否存在等。 -
查询优化器
优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。优化器并不关心使用的什么存储引擎,但是存储引擎对优化查询是有影响的。优化器要求存储引擎提供容量或某个具体操作的开销信息来评估执行时间。 -
查询执行引擎
查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。若开启用查询缓存,这时会将SQL 语句和结果完整地保存到查询缓存(Cache&Buffer)中,以后若有相同的 SQL 语句执行则直接返回结果。
3. 存储引擎
插件式存储引擎是MySQL的一大特点体系结构,每个存储引擎都提供了各自的功能,可以根据业务或者应用场景为数据表选择不同的存储引擎。此外,鉴于MySQL的开源特性,我们可以根据存储引擎接口开发自己的存储引擎或者通过修改源码实现新的特性。
使用“show engines;”命令可以查看当前MySQL支持的存储引擎。MySQL有许多种类的存储引擎供我们选择,如InnoDB、MyISAM、NDB、Memory、Archive、Federated、Maria、CSV、Blackhole、Merge、Example,但目前常用的存储引擎为InnoDB和MyISAM。MySQL 5.5 之后,默认的存储引擎是 InnoDB。
3.1 InnoDB存储引擎
InnoDB存储引擎支持事务。其特点是行锁设计、支持外键、支持非锁定读。
InnoDB的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件。InnoDB中存在表锁和行锁,不过行锁是在命中索引的情况下才会起作用。InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读。
3.2 MyISAM存储引擎
MyISAM只支持表锁,不支持事务。
MyISAM的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中.frm是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。MyISAM由于有单独的索引文件,在读取数据方面的性能很高。MyISAM是以堆结构进行组织数据,其表容易损坏。
关于更多MySQL存储引擎的知识,后续会有专门的章节深入分析。
4. 总结
本节多为介绍性内容,通过对MySQL逻辑结构、运行机制、存储引擎等的了解,将对后续深入理解MySQL有极大帮助。
下一篇:二、MySQL底层存储原理