掘金 后端 ( ) • 2024-04-21 17:14

theme: condensed-night-purple highlight: agate

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!


背景介绍

MySQL作为一款广泛应用的数据库管理系统,其架构所具备的多用途特性和对复杂环境的高度适应性,使其能在诸多应用场景中展现出卓越的性能实力。无论是作为应用程序内核部分实现无缝整合,还是服务于确保数据冗余以达成高可用架构的设计,乃至在承载大规模并发交易、应对实时数据流转需求的在线事务处理系统(OLTP)中。

尽管外界惯以“简约”之名概述MySQL,其实质乃一套内蕴深邃复杂机制与精巧设计的体系架构

技术系列

本系列文章将多角度剖析MySQL的内在构造,包括逻辑架构的层次划分、模块间协同执行机制、多样化的存储引擎策略、严谨的并发控制手段以及稳健的事务管理体系。 在这里插入图片描述

本文的主旨在于深入剖析并详细阐述技术的首个关键领域——【逻辑架构】。我们将对其核心组件、设计理念以及在实际应用中的优势进行全面解读,以期为读者提供一个全面而深入的视角。


逻辑架构

要深刻领悟MySQL服务器的工作机制,关键在于在脑海中构建一幅生动详实的蓝图,形象地描绘其各组成部分之间的精密协作模式,如下图所示。 在这里插入图片描述 可以看到,我们大致将MySQL数据库拆分为:连接处理层,数据缓存层,SQL处理层以及存储引擎: 在这里插入图片描述

连接处理层

大多数基于网络的客户端/服务器工具或服务均展现出相似的结构,涵盖了连接管理、权限验证、安全保障等方面。

当客户端尝试连接到MySQL服务器时,连接处理层会验证客户端的身份(例如,用户名和密码)。如果验证成功,它将建立与客户端的连接,并为该连接分配一个线程,以便后续的查询处理。

数据缓存层

多种缓存机制,用于提高查询性能。

查询缓存可以存储之前执行过的查询及其结果,这样当相同的查询再次执行时,可以直接从缓存中获取结果,而无需重新执行查询。此外,还有用于存储索引和其他数据的缓存,以减少对磁盘的访问。

SQL处理层

MySQL的核心服务功能,包括查询的解析、分析、优化、缓存机制,以及各类内置函数(如日期时间处理、数学运算、加密功能等)。这一层还实现了跨存储引擎的通用功能,如存储过程、触发器和视图等。

当客户端发送一个SQL查询时,SQL处理层首先会解析该查询,生成一个解析树。然后,它会使用查询优化器来找到执行该查询的最有效方法。最后,它会生成一个执行计划,并调用存储引擎来执行该计划。

存储引擎

常见的存储引擎包括InnoDB、MyISAM等。存储引擎负责在底层管理数据文件的存储和检索。它处理SQL处理层发送的指令,执行数据的读取、写入、更新和删除等操作。不同的存储引擎在事务处理、锁定机制、外键支持等方面可能有所不同。

存储引擎API包含数十个底层函数,用于执行如事务启动、按主键检索记录等操作。但存储引擎不参与SQL解析,且不同存储引擎间不进行通信,它们只是简单地响应上层服务器的请求

类似于GNU/Linux系统中的多种文件系统,每种存储引擎都有其独特的优势和局限。服务器通过专用的API与存储引擎进行交互,这些接口有效地掩盖了不同存储引擎之间的差异,使得这些差异对上层查询过程而言是透明的。

逻辑层次的分工

上面说明的层次化的结构使得MySQL非常灵活和可扩展。你可以根据需要选择不同的存储引擎,或者对缓存层进行优化,以提高查询性能。同时,这种结构也使得MySQL更容易维护和扩展新功能。


模块执行

MySQL的架构内部由多个精心设计的模块构成,这些模块各司其职,共同完成了从语法解析、优化查询到结果集返回的整个过程。

连接处理层

在这里插入图片描述

初始化模块

在MySQL Server启动之际,初始化模块便发挥其核心作用,负责对整个系统进行全面的初始化工作。这包括但不限于缓冲区和缓存结构的配置与启动,内存空间的分配与管理,系统变量的预设与调整,以及各存储引擎的初始化配置等。 在这里插入图片描述 此模块促使MySQL Server能够以最佳状态启动,为后续的数据处理和服务提供稳定而高效的支撑。 在这里插入图片描述 初始化模块是MySQL Server启动过程中的关键一环,它确保了系统各项功能的正常运作与性能优化。 在这里插入图片描述

核心API模块

核心API模块致力于提供一系列高效且底层的操作功能优化实现,涵盖了底层数据结构的精心构建、特殊算法的创新实现、字符串与数字处理的优化方案,以及小文件I/O和格式化输出的高效处理。此外,它还负责内存管理的核心部分,确保系统资源得到合理的分配与使用。

网络交互模块

底层网络通信模块通过抽象化接口API,简化了底层网络交互的复杂性,实现了网络数据的接收与发送功能。这一设计使得其他模块能够方便地调用网络交互功能,同时也简化了对这部分代码的维护。

Client&Server 交互协议模块

MySQL的客户端和服务器能够高效、准确地进行信息交换,确保系统的稳定运行和数据的准确传输

MySQL的客户端与服务器交互协议模块,便是负责实现两者间所有交互流程的核心部分。这些交互协议都是基于当前主流的操作系统和网络协议之上构建的,如广为人知的TCP/IP协议和Unix Socket等。

用户模块

用户模块的核心职责在于实施用户登录权限的验证与连接控制,以及执行用户授权管理任务。它宛如MySQL系统的守护神,审慎地判断每位来访者的身份,决定是否为其敞开大门。当客户端(如应用程序)尝试与MySQL服务器建立连接时,服务器会执行一系列认证步骤以确保连接的安全性。这些认证过程主要基于提供的用户名、原始主机信息以及密码进行验证。

案例

如果连接采用了安全套接字层(SSL)加密方式,服务器还可以利用X.509证书进行额外的身份验证,从而增强连接的安全性。一旦客户端通过了认证并成功连接到服务器,服务器会进一步核实该客户端是否具备执行特定查询的权限。

访问控制模块

为了确保系统的安全性和稳定性,我们需要引入一个访问控制模块,它能够实时监控每位用户的操作行为,并根据用户的角色或身份赋予不同的权限,确保每位用户只能在其允许的范围内进行操作。

访问控制模块实现的功能就是根据用户模块中各用户的授权信息,以及数据库自身特有的各种约束,来控制用户对数据的访问。用户模块和访问控制模块两者结合起来,组成了 MySQL 整个数据库系统的权限安全管理的功能

案例

例如,服务器会检查客户端是否被授予了对数据库中XX表执行SELECT语句的权限,以确保数据访问的合法性和合规性。通过这样的认证和权限验证机制,MySQL服务器能够确保只有经过授权且符合安全要求的客户端能够访问和操作数据库资源。

连接管理、连接线程和线程管理

在MySQL服务器进程中,每个客户端连接都会独占一个线程,确保该连接的查询任务仅在该线程内执行。这样的设计确保了查询的隔离性和高效性。同时,这个线程会按照操作系统的调度策略,在CPU核心或CPU中轮流运行,充分利用系统资源。

连接管理模块

在MySQL Server中扮演着至关重要的角色,它时刻保持警觉,监听并接收来自各方的连接请求。一旦有请求接入,它便迅速将这些请求转交给线程管理模块处理。

在这里插入图片描述 为了确保每个客户端都能得到及时且专注的服务,每当有新的客户端连接到MySQL Server时,连接管理模块都会为其分配一个专门的连接线程。这些连接线程是MySQL Server与客户端之间沟通的桥梁,它们负责接收客户端的命令请求,并将Server端的结果信息准确传递回客户端。

线程管理模块

连接线程的管理者,它负责线程的创建、维护以及缓存等工作。通过精心管理这些线程,线程管理模块确保MySQL Server能够高效地处理大量的客户端请求,同时保持系统的稳定性和性能。 在这里插入图片描述

除了上述特点外,MySQL还内置了一套高效的API,专门用于支持线程池(Thread-Pooling)插件的运作。通过这一机制,MySQL能够利用有限数量的线程来处理庞大的连接请求,从而避免了频繁创建和销毁线程所带来的资源消耗。

数据缓存层

在MySQL数据库中,有一个至关重要的模块——查询缓存(Query Cache),这种设计使得MySQL能够迅速响应相同的查询请求,无需重复执行查询操作,从而大大提高了查询效率。 在这里插入图片描述

Query Cache模块(高版本已经去除)

当查询所涉及的基础表中的数据发生任何变化时,MySQL会智能地使相关查询的缓存失效,以确保数据的一致性。在读写操作比例极高的应用系统中,查询缓存对于性能的提升效果尤为显著。

在这里插入图片描述 核心职责是将客户端发送给MySQL的Select类型查询请求的返回结果集存储在内存中,并与这些查询的一个哈希值相对应。

注意,这也意味着它可能会消耗大量的内存资源。因此,在使用查询缓存时,我们需要根据实际应用场景来权衡其带来的性能提升与内存消耗之间的关系

SQL处理层

在MySQL生态系统中,Client端向Server端发送的各类数据操作请求通常被统一归纳为query。这些query指令作为MySQL进行数据处理与交互的基石,承载着客户端丰富的操作意图。无论是数据的增删改查,还是其他复杂的操作请求,都通过query指令得以实现。

当MySQL Server的连接线程接收到客户端发来的Query时,它并不会立即进行处理,而是将其传递给一个专门的模块——即Query解析与分发模块。

Query解析与分发模块

这一模块负责进一步处理和分析Query,并根据其类型和内容,将其分发至相应的处理单元进行执行,query进行深入的语义和语法分析,确保其合法性和准确性。随后,根据query的不同操作类型,该模块会对其进行分类,并精准地转发给相应的处理模块进行后续执行。 在这里插入图片描述

Query优化器模块

Query优化器,其核心功能在于对客户端提交的query进行深度优化。它凭借对客户端query语句的精准解析以及数据库内统计信息的全面掌握,运用一系列先进算法进行缜密分析,旨在制定出最为高效的执行策略。这一策略将精准指导后续程序如何高效地获取query语句所需结果,从而确保数据库查询的高效性与准确性。


整体执行流程

深入探究MySQL的内部机制后,接下来我们聚焦于其各个模块间的协同工作。通过梳理MySQL从启动到客户端连接、发送查询请求、获取返回结果,直至最终退出的完整流程。 在这里插入图片描述

1. MySQL服务启动

1.1 读取配置

执行启动MySQL命令后,初始化模块便着手从系统配置文件中提取系统参数与命令行设置,进而依照这些参数对整个系统进行细致的初始化工作。

1.2 内存分配

内存的合理分配、全局变量的精确设定以及各类数据结构的详尽初始化等环节。这些步骤确保了MySQL系统能够稳定、高效地运行,为后续的数据处理和交互奠定了坚实基础。

1.3 存储引擎

各类存储引擎逐一启动,并各自执行相应的初始化操作,确保它们能够顺利融入整个系统,为数据的存储和检索提供高效支持。

1.4 网络监听

整个系统初始化工作圆满完成后,连接管理模块便接过了重任。该模块随即启动监听程序,以处理来自客户端的连接请求,这包括TCP/IP网络的监听以及UNIX Socket的连接。 在这里插入图片描述 经过上述一系列精细化的启动步骤后,MySQL服务器已经完成了基本的启动流程,并做好了充分的准备,随时待命,以响应客户端发出的各类请求。

2. MySQL接受请求

当连接管理模块侦测到客户端的连接请求时,它便借助网络交互模块的功能与客户端进行交互。遵循C/S交互协议模块所规定的协议进行初步的交流后,连接管理模块便会将这一连接请求转交给线程管理模块,以请求分配一个连接线程。 在这里插入图片描述

2.1 分配连接线程

线程管理模块随即会将控制权交给连接线程模块,并告知其有新的连接请求需要处理。连接线程模块在接收到请求后,会首先检查当前连接线程池中是否有可用的空闲连接线程。

2.2 处理连接请求

如果发现有可用的空闲线程,它便会选取一个与客户端建立连接,若线程池中没有空闲线程,则会新建一个连接线程以响应客户端的请求。

注意,连接线程模块并不会立即与客户端建立连接。它首先会调用用户模块进行授权检查,确保客户端的请求已通过必要的权限验证。只有在通过授权检查后,连接线程模块才会将客户端的请求与负责处理该请求的连接线程进行连接

3. MySQL执行请求

客户端与连接线程通过协议顺利建立通信,连接线程随即承担起处理客户端发送的各类请求的职责。每当接收到Query语句时,连接线程会迅速将其转交给Query解析与分发模块。

3.1 语义和语法分析

首先对Query进行初步的语义与语法分析,确保其逻辑正确且符合语法规范。随后,根据请求的具体类型,一部分请求会直接在模块内部得到妥善处理,而另一部分则会被精准地分发给其他相关模块进行进一步的处理,以确保每个请求都能得到准确且高效的响应。

3.2 解析Query请求类型

若是一个Query类型的请求,控制权会转交给SQL解析器。解析器首先判断该请求是否为select类型的Query。

  • 命中缓存:它会调用查询缓存模块来检查该query是否已在缓存中存在。若缓存中存在相应数据,则直接返回给连接线程模块,并通过与客-户端的连接线程将数据传送给客户端。

  • 未命中缓存:若该Query不属于可缓存类型,或缓存中不存在相关数据,则Query将返回给解析器进行进一步处理,并通过查询分发器分发给相应的处理模块进行处理。

3.3 Query优化器处理

当解析器识别出一条尚未缓存的select语句时,它会将控制权顺利移交至Query优化器模块,也就是我们所称的Optimizer。通过这一移交过程,确保select语句能够得到高效的优化处理,从而提升查询性能。

3.4 资源权限判断执行

3.4.1 锁(资源)+ 权限控制判定

在Query解析与分发模块成功将请求分派至相应模块后,这些模块的首要任务是通过访问控制模块进行严格的权限验证。这确保了连接用户只有在满足访问目标表及字段的权限要求时,才能继续执行后续操作。一旦用户权限得到确认,表管理模块随即被调用,负责请求所需的表,并尝试获取必要的锁,以确保数据的一致性和安全性。

3.4.2 table cache优化机制

表管理模块会首先检查该表是否已存在于table cache中,若已存在则直接进行锁相关的处理;若不在cache中,则需要打开表文件并获取锁,之后将打开的表交给表变更管理模块。

Table cache是MySQL为了提高性能而设计的一种缓存机制,存储了最近访问过的表的元数据和部分数据,以便快速响应后续的请求。

3.4.3 多类型指令判断执行

多个专项小模块各司其职,包括负责插入操作的insert处理器、负责删除操作的delete处理器、负责更新操作的update处理器、负责创建操作的create处理器以及负责修改操作的alter处理器等,它们共同协作,高效处理各种DML和DDL操作任务。

3.5 下发到存储引擎

3.5.1 解析元数据调用标准接口

解析该表的元数据信息,进而确定其采用的存储引擎类型以及其他关键属性。基于这些信息,模块会向专门的存储引擎接口模块发起请求,并调用相应的存储引擎实现模块以执行特定的操作。

3.5.2 自动调用对应的引擎实现

对于表变更管理模块而言,底层存储引擎的具体实现细节是透明的。它只需调用标准的接口,并指定表的类型,接口模块便会根据这些信息自动选择并调用合适的存储引擎,确保数据处理的高效性和准确性。


未完待续

后面的文章中,我们还将对MySQL数据库的多个核心架构进行深入剖析,包括其存储引擎的运作机制、高效的并发控制策略以及精细的事务管理等方面。我们将逐一详细介绍这些组件的设计理念、功能特点以及在实际应用中的表现,帮助大家更全面地了解MySQL数据库的内部架构和工作原理。

存储引擎

敬请期待:分布式技术导论 — 探索分析从起源到现今的巅峰之旅(存储引擎)


并发控制

敬请期待:分布式技术导论 — 探索分析从起源到现今的巅峰之旅(并发控制)


事务管理

敬请期待:分布式技术导论 — 探索分析从起源到现今的巅峰之旅(事务管理)