【揭秘】MySQL逻辑架构:一文带你全面了解!

news2024/11/14 15:08:29

mysql是我们开发过程中使用的最多的数据库,大多数程序员平时都是做CRUD,如果CRUD慢了,那就再加一个索引,如果加上索引还不行,那基本上开发就没辙了,因为对mysql内部理解不深入、不清晰,所以问题无从下手,比如,涉及存储引擎、执行计划、缓存之类的优化和调试,这类内容最后还是得专业的DBA来做。

但是,如果我们开发自己也能来做,一来可以提升自己的技术能力和技术深度,二来可以获得更好的职场上升机会,从而获得更多的加薪,所以我们开发不仅要会使用mysql,还要深入了解mysql,至少也得知道mysql由哪几块组成,每一个块的职责是什么,遇到问题时也有排查方向。

本文的核心内容就是梳理mysql的逻辑架构图,分别说明mysql逻辑架构中每一块的工作内容和职责。见下图mysql逻辑架构图:

img

MySQL Server

Services&utilities

image-20231117102846052

这是一个包含了各种管理和监控工具的组件,它主要用于提供对MySQL数据库的管理、监控和维护功能。

首先是Services,Services主要负责处理来自客户端的连接请求,包含了MySQL的大多数核心服务,包括验证用户的身份、连接器、查询缓存、分析器、优化器、执行器等,以及负责SQL语句的解析、优化、缓存查询以及所有内置函数(如日期、时间、加密函数等)的实现,同时Service层也负责实现所有跨存储引擎的功能,如存储过程、触发器和视图等。

其次是Utilities,这里包含一些用于数据库备份和恢复、数据导入导出、性能监控和分析、安全管理等方面的工具,这些工具可以通过命令行或图形用户界面访问,并提供了一系列功能和选项,以满足不同用户的需求,常见的Utilities包括:

  1. mysqldump:用于备份数据库或单个表的内容,并将其导出为SQL脚本文件。
  2. mysqlimport:用于从文本文件或其他格式的文件导入数据到MySQL表中。
  3. mysqlshow:显示数据库、表或列的信息,帮助用户了解数据库结构。
  4. mysqladmin:执行管理操作,如关闭数据库、刷新表、检查表等。

Connection Pool

image-20231117102906791

连接池的首要作用是复用已经创建的数据库连接,这样,当一个新的请求来临时,它不需要重新走完整的TCP三次握手流程,直接从连接池里取出一个空闲连接来使用,大大提升了处理速度。可以设定连接的最大数量,防止因为过多的数据库连接导致服务器资源耗尽。当数据库服务器负载过高时,通过连接池的限制可以避免过多的连接请求对数据库造成影响,保证了数据库的稳定运行。它具有以下核心参数:

  1. max_connections: 这是一个非常重要的参数,它定义了MySQL服务器同时允许的最大连接数。当连接数达到此值时,新的连接请求可能会被拒绝。这个参数直接影响到连接池的大小。
  2. connection_timeout: 这个参数定义了一个连接在连接池中的最大存活时间。如果一个连接在这个时间内没有被使用,它将被关闭并从连接池中移除。
  3. wait_timeout: 这个参数定义了连接空闲多久后会被断开。它可以影响连接池中连接的可用性。
  4. max_used_connections: 这个参数记录了服务器启动后同时使用的连接的最大数量。它可以帮助你评估是否需要增加或减少连接池的大小。
  5. threads_cached: 该参数表示缓存的线程的数量。当一个客户端断开之后,如果线程数量小于threads_cached,该线程不会被立即销毁,而是放入线程缓存中,等待被别的客户端使用。
  6. thread_cache_size: 这个参数用来设置线程缓存的大小。一般来说,如果应用有大量的新建连接,应该调大这个参数。线程缓存命中率=Threads_created/Connections,命中率越低越好。

除了上述参数外,还有其他与连接池相关的参数,如innodb_thread_concurrency等,它用于控制InnoDB存储引擎内部的并发线程数量。

SQL Interface

image-20231117102931110

它是整个数据系统与用户进行交互的关键部分,负责接收并处理用户的SQL命令。

具体来说,当用户提交一个SQL命令时如select*from tb_user,这个命令首先会被送到SQL Interface模块。然后,SQL Interface会根据这个命令的内容对其进行分类和解释。如果这个命令是一个SELECT语句,那么SQL Interface就会将其转发到查询缓存或解析器模块;如果这是一个INSERT、UPDATE或DELETE等数据修改语句,那么SQL Interface则会将其发送到事务管理模块。 此外,SQL Interface还负责向用户提供查询结果。当解析器或存储引擎处理完一条SQL命令后,它们会把结果发送回给SQL Interface。然后,SQL Interface再把这些结果组织起来,并最终返回给用户。

Parser

image-20231117102944721

SQL Parser负责将用户输入的SQL命令转换成MySQL内部可以理解的指令。同时将其转换成内部的数据结构,并为后续的查询优化和执行提供必要的信息。它主要做以下几件事情:

  1. SQL语句解析: 解析器的首要任务是接收输入的SQL语句,并将其拆解成多个组成部分,如SELECT、FROM、WHERE等关键字、表名、列名、运算符等。这个过程称为词法分析。
  2. 语法验证: 在拆解SQL语句后,解析器会根据MySQL的语法规则验证这些组成部分是否合法。如果输入的SQL语句不符合MySQL的语法规则,解析器会报错并拒绝执行该语句。
  3. 生成数据结构: 如果SQL语句在语法上是合法的,解析器会将这些组成部分转化为MySQL服务器内部使用的数据结构。这些数据结构为后续的操作,如查询优化和执行,提供了基础。
  4. 语义分析: 除了语法分析外,解析器还可能进行语义分析,例如检查引用的表和列是否存在、检查权限等。

Optimizer

image-20231117102957517

它的作用至关重要,负责优化SQL查询的执行计划,以提高性能和效率,直接影响数据库查询的执行方式和速度。

  1. 查询优化:SQL Optimizer通过分析查询语句、数据库结构和索引等信息,生成最优的执行计划。它选择不同的查询执行策略,如选择最合适的索引、确定连接顺序等,以便高效地检索数据并返回查询结果。
  2. 执行计划生成:SQL Optimizer根据查询语句中的表、索引、连接条件等,生成执行计划。执行计划描述了查询执行的详细步骤和访问方法,包括数据的访问顺序、连接方式、索引选择等。一个优秀的执行计划可以显著减少查询执行的时间和资源消耗。
  3. 索引选择:SQL Optimizer根据查询条件和表结构,选择合适的索引来加速查询。它评估不同索引的成本和效益,并选择最优的索引来检索数据。通过合理选择索引,可以提高查询性能,减少磁盘I/O操作和数据扫描的数量。
  4. 查询重写:在某些情况下,SQL Optimizer可能会对查询语句进行重写,以改进执行计划。例如,它可以将复杂的子查询转换为连接操作,或者将多个连接操作重写为单个连接操作。这些重写操作可以简化查询执行的逻辑,提高效率。

此外,MySQL也提供了一些工具供我们查看和分析优化器的工作过程,例如Optimizer Trace特性。通过开启Optimizer Trace,可以将优化器的决策和执行过程输出为文本形式,帮助我们更好地理解和控制优化器的行为。

虽然MySQL的优化器非常强大,但也有其局限性。比如对于包含count()+group by之类的sql,MySQL的优化效果可能不尽如人意。

Caches

image-20231117103008439

它主要用于缓存查询结果,以提高查询性能。

当SQL Optimizer生成了一个优化后的查询计划后,它就会将这个查询计划传递给存储引擎执行。存储引擎会根据这个查询计划来检索出所需的数据,并将结果返回给SQL Optimizer。此时,SQL Optimizer会选择是否将这个查询结果缓存在Cache中。如果选择了缓存,则下次遇到相同的查询时,就可以直接从缓存中获取结果,而无需再次访问磁盘上的数据文件。

Caches的使用对于提升MySQL性能非常重要,但也有一些需要注意的地方:

  • 缓存失效:如果数据库中的数据发生变化,那么相应的查询缓存就会失效。因此,对于经常更新数据的应用程序,查询缓存可能不太有效。
  • 缓存占用资源:缓存会占用一定的内存资源,因此需要根据实际情况合理配置缓存大小,避免过度消耗服务器资源。

为了合理利用查询缓存,我们需要理解并掌握一些相关的参数和设置。例如,可以通过设置query_cache_limit参数来限制可缓存具体查询结果的最大值;通过设置query_cache_size参数来调整查询缓存的大小;通过设置query_cache_type参数来决定是否启用查询缓存等。

Storege Engines

image-20231117103020362

MySQL最显著的特点是采用了插件式的存储引擎体系结构。

Pluggable Storage Engines是一个用于管理不同类型的数据库存储引擎的关键组件。它使得MySQL能够支持多种不同的数据存储方式,以满足不同场景下的需求。这意味着服务器中的查询执行引擎通过API接口与存储引擎进行通信,而这个接口则屏蔽了不同存储引擎之间的差异。因此,无论使用哪种存储引擎,对于上层的应用来说,都可以保持相对的一致性和简单性。 具体来说,MySQL中的存储引擎是指负责处理数据存储和检索操作的底层程序。每个存储引擎都有其特定的优点和缺点,适用于不同的应用场景。例如,MyISAM存储引擎适合于读取密集型的应用场景,而InnoDB存储引擎则适合于写入密集型的应用场景。 为了方便用户选择和使用合适的存储引擎,MySQL引入了Pluggable Storage Engines的概念。通过这个组件,用户可以在运行时动态地加载和卸载不同的存储引擎,以满足不同的应用需求。

Logs and Files

image-20231117103043750

这块区域包含两部分内容,

1、日志(Logs),日志是MySQL数据库中用于记录数据库操作和事务的重要工具。它们帮助数据库管理员跟踪数据库活动,进行故障恢复,以及优化数据库性能。在MySQL中,主要有以下几种类型的日志:

  1. 通用日志(General Logs): 通用日志记录了MySQL服务器的所有操作,包括SQL语句的执行、复制、备份等。这些日志可以帮助管理员监控和管理数据库服务器。
  2. 慢查询日志(Slow Query Logs): 慢查询日志记录了执行时间超过特定阈值的SQL语句。这些日志帮助管理员识别性能问题,如数据库查询的瓶颈和不必要的复杂查询等。
  3. 错误日志(Error Logs): 错误日志记录了MySQL服务器的错误信息,包括启动、运行和停止过程中出现的错误。这些日志帮助管理员诊断和解决数据库服务器的问题。
  4. 二进制日志(Binary Logs):二进制日志记录了数据库的所有更新操作,包括插入、更新和删除操作。这些日志用于数据备份、主从复制以及恢复数据到特定时间点。
  5. 事务日志(Transaction Logs):事务日志记录了事务的提交和回滚信息,用于保证事务的一致性和ACID属性。它们在InnoDB存储引擎中发挥作用。

2、文件(Files):

在MySQL数据库中,文件是用来存储数据和元数据的。主要有以下几种类型的文件:

  1. 数据文件(Data Files): 数据文件存储了数据库中的实际数据,包括表中的行、列和索引等。每个数据库在MySQL中都有对应的数据文件。
  2. 配置文件(Configuration Files): 配置文件包含了MySQL服务器的配置信息,如端口号、用户名、密码等。这些文件帮助管理员配置和管理MySQL服务器。
  3. 日志文件(Log Files): 日志文件包括前面提到的各种日志文件,如通用日志、慢查询日志等。它们帮助管理员监控和管理数据库服务器。
  4. 临时文件(Temporary Files): 临时文件用于存储临时数据和中间结果,如排序操作产生的临时表等。它们帮助优化数据库查询的性能。
  5. 备份文件(Backup Files): 备份文件是数据库数据的副本,用于数据恢复和备份策略的实施。

logs和files在MySQL数据库架构中扮演着重要的角色。它们帮助维护数据库的稳定性和可靠性,并提供诊断、监控和管理数据库的工具和方法。在使用和管理MySQL数据库时,理解这些日志和文件的用途和特点是非常重要的。

Files System

image-20231117103054422

这块内容比较简单,指用来支撑MySQL运行的文件系统,比如运行在linux需要ext4文件系统支持,运行在window上需要NFTS文件系统支持,

总结

MySQL的逻辑架构可以分为几个层次,每个层次都有特定的功能和组件:

  1. 连接层(Connection Layer):这一层负责处理客户端的连接请求,管理连接和会话。它支持多种连接协议,如TCP/IP、Unix套接字等。同时还支持身份验证和安全性相关的操作,如用户身份验证、访问控制列表(ACL)管理等。
  2. 服务层(Services Layer):这一次负责在处理底层数据之前执行所有的操作,包括解析SQL查询、权限检查、查询优化、缓存管理等。同时这一层还负责执行内置函数和操作符,并提供各种SQL扩展和功能。
  3. 引擎层(Storage Engine Layer):引擎层通过API与服务层进行通信,提供数据的底层操作,如数据的存储、检索、索引和事务管理。MySQL支持多种存储引擎,每种引擎具有不同的特性和优势。
  4. 存储层(Storage Layer):存储层负责实际的数据存储和管理。它通常建立在文件系统之上,使用文件来存储数据库的数据和索引。存储层还与存储引擎进行交互,提供数据的持久化存储和访问。

完!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1229499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能货柜:无人零售行业的新宠

智能货柜:无人零售行业的新宠 与早期的传统自动售货机相比,智能货柜的投放场景正呈现多样化的趋势。除了人流密集的公共场所,一些办公室、健身房等室内场景也成为商家争相争夺的热门位置。 其次,在无人零售行业中,许多…

转录组学习第三弹-下载SRR数据并转成fastq

下载数据 前面已经安装好了需要的软件,那么我们现在需要下载我们练习需要用到的sra数据。从 SRA 数据库下载数据有多种方法。可以用ascp快速的来下载 sra 文件,也可以用wget或curl等传统命令从 FTP 服务器上下载 sra 文件。另外sra-tools的prefetch也支…

Zeet构建多云战略充分发挥云的优势

大型企业通常拥有基础设施和应用团队,有能力围绕自己的业务需求构建所需平台。但对于技术团队精简、预算紧张的小企业来说,定制平台往往不现实而且难以扩展,是负担不起的“奢侈品”。 这一情况催生了平台即服务(PaaS)…

ospf路由选路及路由汇总

一、知识补充 1、ABR和ASBR 1.1 ABR ABR指的是边界路由,通常位于两个或多个区域之间,用于在不同的OSPF区域之间传递信息。当一个路由器同时连接到两个或多个区域时,它就成为了ABR,它需要维护每个区域的拓扑信息和路由表&#x…

PC3392H高性价方案比10V-120V输入1.5A大电输出内置MOS管带EN功能实现零功耗使能只需极少元器件

1.PC3392H 特性  通过使能脚关断实现零功耗  宽电压输入范围 10V 至 120V  最大输出电流 1.5A  集成功率 MOS 管  外围器件少  输出短路保护  温度保护  逐周期限流  输出电压灵活可靠  ESOP8 2. 描述 PC3392H 一款宽电压范围降压型 DC-DC 电源…

CentOS安装nodejs

查看可安装的版本 dnf module list nodejs选择需要版本安装 dnf module install nodejs:<stream>查看版本

使用JDK自带java.util.logging.Logger引起的冲突问题

现象&#xff1a; 应用代码如下&#xff1a; import javax.script.ScriptEngineManager;ScriptEngineManager manager new ScriptEngineManager(); manager.getEngineByName("JavaScript"); 在TongWeb8上运行出错&#xff0c;日志如下&#xff1a; Servlet.servi…

一步一步教你如何在Windows 10上使用Java,包括下载、安装和配置等

Java开发工具包(JDK)是用于Java编程的软件,与Java虚拟机(JVM)和Java运行时环境(JRE)一起使用。JDK包括编译器和类库,允许开发人员创建可由JVM和JRE执行的Java程序。 在本教程中,你将学习在Windows上安装Java开发工具包。 检查是否安装了Java 在安装Java开发工具包之…

比科奇推出5G小基站开放式RAN射频单元的高性能低功耗SoC

全新的PC805作为业界首款支持25Gbps速率eCPRI和CPRI前传接口的系统级芯片&#xff08;SoC&#xff09;&#xff0c;消除了实现低成本开放式射频单元的障碍 中国北京&#xff0c;2023年11月 - 5G开放式RAN基带芯片和电信级软件提供商比科奇&#xff08;Picocom&#xff09;今日…

微创机器人:CRM撬动售后服务数字化升级

一方面&#xff0c;我国医疗器械行业起步较晚&#xff0c;更注重产品的销售和业务的拓展&#xff0c;企业售后服务整体比较滞后。 另一方面&#xff0c;医疗器械售后服务环节数字化程度不足&#xff0c;一些企业仍通过传统的线下手段管理售后服务&#xff0c;进行数字化尝试的…

SIMULIA 2022 Abaqus新功能之非线性、工作流、子程序、Explicit等

Abaqus 非线性力学的功能增强 Valanis-Landel 超弹性材料 通过指定单轴试验数据和可选的体积试验数据&#xff08;v2022新增选项&#xff09;来定义Valanis-Landel 超弹性模型&#xff0c;该模型能精确地复现给定的数据&#xff0c;类似Marlow模型&#xff0c;但与Marlow模型的…

俄罗斯操作系统Aurora OS 5.0全新UI亮相

俄罗斯媒体 IXBT 报道称&#xff0c;该地本土企业 Открытая мобильная платформа 于 2023 年 11 月 9 日至 10 日在圣彼得堡举行的 Mobius 2023 年秋季移动开发者专业会议上&#xff0c;展示了 Aurora OS 5.0 的界面和其他细节。 据介绍&#xff0c;…

滚动更新和回滚部署在 Kubernetes 中的工作原理

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 在过去的几年中&#xff0c;Kubernetes 在生产环境中被广泛使用&#xff0c;它通过其声明式 API 提供了大量解决方案&#xff0c;用于编排容器。 Kubernetes 的一个显著特性是其具有…

简化业务流程——通知短信API在企业中的应用

引言 通知短信API是一种可以帮助企业简化业务流程的通讯工具。随着移动互联网技术的不断发展&#xff0c;移动通讯已经成为了我们日常生活和企业运营中不可或缺的一部分。通知短信API是一种可以在企业中将移动通讯应用到极致的工具&#xff0c;它可以为企业提供高效便捷的通讯…

JSP协同办公eclipse定制开发mysql数据库BS模式java编程OA系统

一、源码特点 java 协同办公管理系统是一套完善的web设计系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

Docker之虚悬镜像(查看、删除)

虚悬镜像: 仓库名、标签都是的镜像&#xff0c;俗称dangling image 查看 docker image ls -f danglingtrue删除 虚悬镜像已经失去存在价值&#xff0c;可以删除 docker image prune

ESP32 http 请求

目录 参考教程1.使用的http连接2.使用Vscode-IDF创建http_request例程3.修改http_request_example_main.c函数4.已经获取到响应的数据 参考教程 ESP-IDF HTTP获取网络时间 1.使用的http连接 http://api.m.taobao.com/rest/api3.do?apimtop.common.getTimestamp请求可以得到…

系列四、Java8的Lambda表达式

一、概述 Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力得到了提升。 Lambda 表达式在Jav…

【开源】基于JAVA的校园二手交易系统

项目编号&#xff1a; S 009 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S009&#xff0c;文末获取源码。} 项目编号&#xff1a;S009&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模…