????作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。
???? 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
???? InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 ????
????如果此文还不错的话,还请????关注、点赞、收藏三连支持????一下博主~
本文目录
2.2、Service & utilities (服务治理&工具集)
本文导读
《本专栏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 -p
mysql -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的逻辑结构。