作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家

如果此文还不错的话,还请关注、点赞、收藏三连支持一下博主~

本文目录

本文导读

一、MySQL 体系结构

1、Client Connectors (客户端链接)层

2、MySQL Server (MySQL 服务)层

2.1、Connection Pool(链接池)

2.2、Service & utilities (服务治理&工具集)

2.3、SQL interface(SQL接口)

2.4、Parser (解析器)

2.5、Optimizer (查询优化器)

2.6、Caches (缓存)

3、Storage Engines (存储引擎)层

二、 一条 SQL 的内部执行流程

三、链接器

四、查询缓存

1、查询缓存步骤

2、查询缓存使用场景

五、分析器

1、分析器工作原理

六、优化器

七、执行器

总结


本文导读

《本专栏MySQL》已经更新了15篇,基本的知识以及实际应用的一小部分已经更新完毕,如果对MySQL 有一些疑惑,不要陷入一个管中窥豹、盲人摸象的状态,你应该有自己的“一言以蔽之”和对MySQL 的鸟瞰,这可以帮助你从高维度理解问题。

本文就是带你系统性学习MySQL 数据库的体系结构,详细介绍了MySQL的逻辑结构。

一、MySQL 体系结构

MySQL 体系结构由 Client Connectors (客户端链接)层、MySQL Server (MySQL 服务)层及 Storage Engines (存储引擎)层组成。

1、Client Connectors (客户端链接)层

它负责处理客户端的链接请求并创建与客户端的链接。目前,MySQL几乎支持所有的链接类型,如JDBC(Java语言的链接)、Python、Go、.NET、C语言等。

2、MySQL Server (MySQL 服务)层

MySQL架构图:

MySQL Server层主要包括 Connection Pool 链接池、Service & utilities 服务治理和工具、SQL interface SQL接口、Parser 解析器、Optimizer查询优化器、Caches 缓存等模块。

2.1、Connection Pool(链接池)

Connection Pool 连接池负责处理和存储数据库和客户端之间创建的链接。

一个线程负责管理一个链接。

连接池包括用户认证模块,该模块对用户的登录身份进行认证、认证和安全管理,即用户执行操作权限验证。

2.2、Service & utilities (服务治理&工具集)

Service & utilities 是服务治理&工具集,包括Backup & Restore(数据备份和还原)、Security(安全)、Replication(复制)、Cluster(聚簇)、Partitioning(分区)、Workbench(工作台)等等集群管理服务和工具。

2.3、SQL interface(SQL接口)

SQL interface负责接收客户端发送的各种 SQL 语句,比如 DML、DDL 和 Stored Procedure (存储过程)、Triggers(触发器)、Views(视图)等。

2.4、Parser (解析器)

Parser 解析器会对 SQL 语句进行Syntactic(语法)、Lexical(词汇)、Semantic(语义)等等解析生成解析树。

2.5、Optimizer (查询优化器)

Optimizer查询优化器将基于解析树生成执行计划,选择适当的索引,然后根据执行计划执行SQL语言,并与每个存储引擎交互。

2.6、Caches (缓存)

Caches缓存包括各种存储引擎的缓存,例如InnoDB的缓冲池 Buffer Pool 和MyISAM的 key buffer 密钥缓冲区。缓存还缓存一些权限,包括 Session会话级缓存。

3、Storage Engines (存储引擎)层

存储引擎包括MyISAM、InnoDB、Archive和Memory。MySQL是一个插件存储引擎。只要正确定义了与MySQL Server的接口,任何引擎都可以访问MySQL,这也是MySQL受欢迎的原因之一。

存储引擎底部是物理存储层,是文件的物理存储层,包括Binary(二进制日志)、Error(错误日志)、Redo log、Undo log、Data(数据文件)、Index、慢查询日志、全日志等。

二、 一条 SQL 的内部执行流程

MySQL各功能模块中SQL语句的执行过程:

1、建立链接,通过客户端/服务器通信协议连接到 MySQL;

2、查询缓存,如果启用了 Query Cache (查询缓存),并且在查询缓存期间查询到相同的SQL语句,则查询结果将直接返回给客户端,MySQL优化查询;

如果没有打开 Query Cache (查询缓存)没有查询到确切的SQL语句,解析器将解析语法和语义并生成解析树。

3、预处理器生成一个新的解析树;

4、查询优化器生成执行计划;

5、查询执行引擎执行SQL语句,查询执行引擎,将根据SQL语句中表的存储引擎类型以及相应的API接口与底层存储引擎缓存或物理文件之间的交互来获得查询结果。

6、查询结果将被缓存,并在MySQL Server 过滤后返回给客户端。如果启用了查询缓存,SQL语句和结果将完全保存在查询缓存中。如果以后执行相同的SQL语句,将直接返回结果。

三、链接器

连接器负责与客户端建立连接、获取权限、维护和管理连接。

-- 连接命令mysql -h$ip -P$port -u$user -pmysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306[端口]

当我们输入命令后,MYSQL客户端工具(Navicat、JDBC)会使用跟服务端建立连接,然后经历经历TCP连接(三次握手),连接器将开始验证您的身份。此时,将使用您输入的用户名和密码。

如果用户名或密码不正确,您将收到“拒绝用户访问”(Access denied for user)错误,然后客户端程序结束。

如果用户名和密码经过身份验证,连接器将检查权限表中的权限。稍后,此连接中的权限判断逻辑将取决于此时读取的权限。

如果客户端长时间不移动,连接器将自动断开它。该时间由参数wait_由超时控制。默认值为8小时。

如果客户端在连接断开后再次发送请求,它将收到错误提示:在查询过程中与MySQL服务器的连接丢失。此时,如果要继续,则需要重新连接,然后执行请求。

在数据库中,长连接意味着成功连接后,如果客户端继续有请求,它将始终使用相同的连接。短连接意味着每次执行几个查询后,连接断开,然后重新建立下一个查询。

建立连接的过程通常很复杂,因此建议您尽量减少建立连接的操作,即尝试使用长连接。

四、查询缓存

建立连接后,执行逻辑将进入查询缓存。

1、查询缓存步骤

在MySQL收到查询请求后,它将首先转到查询缓存,以查看此语句之前是否执行过。以前执行的语句及其结果可以以键值对的形式直接缓存在内存中。键是查询语句,值是查询结果。如果查询可以直接在缓存中找到键,则该值将直接返回给客户端。

如果该语句不在查询缓存中,则后续执行阶段将继续。执行后,执行结果将存储在查询缓存中。如您所见,如果查询命中缓存,MySQL可以直接返回结果,而无需执行以下复杂操作,这将非常高效。

-- 默认情况下,可以指定要使用查询缓存的语句-- 可以用SQL_ CACHE显示去指定。如下:select SQL_ CACHE from stable where id=10;-- 查询当前实例是否开启缓存机制show global variables like "%query_ cache_ type%" ;-- 监控查询缓存的命中率(查看运行的缓存信息)show status like ' %Qcache%';

2、查询缓存使用场景

在大多数情况下,不建议使用查询缓存。查询缓存失效非常频繁。只要更新了表,表上的所有查询缓存都将被清除。

对于更新压力较大的数据库,查询缓存的命中率将非常低。除非您的企业有一个静态表,否则它在很长一段时间内只会更新一次。例如,对于系统配置表,此表中的查询适合于查询缓存。

五、分析器

1、分析器工作原理

如果查询缓存未命中,将执行该语句,所以它需要解析SQL语句。

分析器将首先进行“词法分析”。输入由多个字符串和空格组成的SQL语句。MySQL需要识别字符串是什么并表示什么。MySQL是通过您输入的关键字“select”来识别的,这是一个查询语句。它还将字符串“T”标识为“表名T”,将字符串“ID”标识为列ID。

完成这些识别后,需要进行“语法分析”。根据词法分析的结果,解析器将根据语法规则判断您输入的SQL语句是否符合MySQL语法。

如果您的语句不正确,您将收到“SQL语法中有错误”的错误提示(You have an error in your SQL syntax)。

六、优化器

在分析器之后,MySQL将知道您想要做什么。在执行之前,优化器必须首先处理它。

当表中有多个索引时,优化器决定使用哪个索引;或者,当一个语句有多个表连接时,确定每个表的连接顺序。

对SQL语法树执行逻辑和物理优化,最后生成SQL执行的执行计划。

逻辑优化,会将SQL语法树中的谓词转换为逻辑代数运算符,从而将语法树转换为关系代数语法树,然后执行一系列逻辑优化,如语义优化、查询优化、冗余减少操作、公共表达式的连接提取、,最后生成逻辑查询执行计划

物理优化,SQL语法树将在逻辑优化后继续修改。如果连接了多个表,则会调整表的连接顺序,SQL语法树也会相应调整。此外,将使用成本估计器来评估扫描单个表的成本和多个表的连接顺序,并选择成本最低的方案作为下一次优化的基础,然后生成物理查询执行计划。

七、执行器

MySQL 通过分析器知道做什么,以及如何通过优化器来做,最后进入执行器阶段并开始执行语句。

在执行开始时,您应该首先确定您是否有权对该表T执行查询。如果没有,将返回未经许可的错误。如果有权限,打开表以继续执行。当打开表时,执行器将根据表的引擎定义使用引擎提供的接口不听调用。

总结

《本专栏MySQL》已经更新了15篇,基本的知识以及实际应用的一小部分已经更新完毕,如果对MySQL 有一些疑惑,不要陷入一个管中窥豹、盲人摸象的状态,你应该有自己的“一言以蔽之”和对MySQL 的鸟瞰,这可以帮助你从高维度理解问题。

本文就是带你系统性学习MySQL 数据库的体系结构,详细介绍了MySQL的逻辑结构。