本文为系列开篇旨在从整体对MySQL数据库进行一个认识,随后的系列文章会深入其各个方面进行原理解析,进一步加深对MySQL的认知、提升自己对MySQL的运用、运维及优化能力。
MySQL逻辑架构整体分为三层:
从图中我们可以看到,MySQL逻辑架构由以下组件组成:
MySQL连接器为客户端程序提供与MySQL服务器的连接。 连接器使您能够连接和执行来自另一种语言或环境的MySQL语句,包括ODBC,Java(JDBC),Perl,Python,PHP,Ruby和本机C MySQL实例。
Oracle开发了很多连接器:
1、Connector / C ++ 使C ++应用程序可以连接到MySQL。
2、Connector / J 提供驱动程序支持,可使用标准Java数据库连接(JDBC)API从Java应用程序连接到MySQL。
3、Connector/NET 使开发人员可以创建连接到MySQL的.NET应用程序。 Connector/NET 实现了功能齐全的ADO.NET接口,并提供了与ADO.NET感知工具一起使用的支持。 可以支持任何.NET语言编写的应用程序连接MySQL数据库。
适用于Visual Studio的MySQL可与Connector / NET和Microsoft Visual Studio 2012、2013、2015和2017配合使用。适用于Visual Studio的MySQL提供对来自Visual Studio的MySQL对象和数据的访问。 作为Visual Studio程序包,它直接集成到Server Explorer中,从而能够创建新连接并使用MySQL数据库对象。
4、Connector/ODBC 为使用开放数据库连接(ODBC)API连接到MySQL提供驱动程序支持。 支持从Windows,Unix和macOS平台进行ODBC连接。
5、Connector/Python 提供了对Python语言驱动程序支持,可使用兼容 Python DB API版本2.0的API从Python应用程序连接到MySQL。不需要其他Python模块或MySQL客户端库。
系统管理和控制工具,比如MySQL安装包bin目录下提供的服务管理和工具(mysqld、mysql_safe、mysql.server等)。
连接池是一种创建和管理可供任何需要它们的线程使用的连接池的技术。 连接池可以大大提高Java应用程序的性能,同时减少总体资源使用量。
负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
与许多其他解析器一样,MySQL的解析器由两部分组成:词法扫描器和语法规则模块。词法扫描器将整个查询分解为标记(不可分割的元素,例如列名),而语法规则模块查找产生此序列的SQL语法规则的组合,并执行与这些规则关联的代码。最后,生成了一个分析树,优化器则可以基于它进行优化工作。
SQL命令传递到解析器的时候会被解析器验证和解析。MySQL Parser(解析器) 是利用C/C++实现的开源yacc/lex组合,也就是 GNU bison/flex。Flex负责生成tokens, Bison负责语法解析。
在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。
查询解析器组件主要功能:
SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略.
SELECT * FROM tbl_name WHERE 0;
在这种情况下,MySQL查看WHERE子句,意识到没有行可能满足查询,就不会再去搜索表。 您可以通过发出EXPLAIN语句来查看此信息,该语句告诉MySQL显示一些有关如何在不实际执行SELECT查询的情况下执行SELECT查询的信息。
EXPLAIN SELECT * FROM tbl_name WHERE 0
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
------ ----------- ------ ---------- ------ ------------- ------ ------- ------ ------ -------- ------------------
1 SIMPLE (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) Impossible WHERE
MySQL使用多种策略将信息缓存在内存缓冲区中以提高性能。根据您的数据库体系结构,您可以平衡这些区域的大小和布局,以在不浪费内存或不超过可用内存的情况下提供最大的性能优势。
他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做
一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
从图可以看出,MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。
注意:存储引擎是基于表的,而不是数据库。
这里主要介绍InnoDB引擎和MyISAM引擎,其它引擎后文会单独介绍