likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 5

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

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

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

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

MySQL Server

Services&utilities

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

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

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

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

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

Connection Pool

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

连接池的首要作用是复用已经创建的数据库连接,这样,当一个新的请求来临时,它不需要重新走完整的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

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

它是整个数据系统与用户进行交互的关键部分,负责接收并处理用户的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

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

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

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

Optimizer

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

它的作用至关重要,负责优化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

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

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

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

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

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

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

Storege Engines

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

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

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

Logs and Files

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

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

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

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

这块内容比较简单,指用来支撑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):存储层负责实际的数据存储和管理。它通常建立在文件系统之上,使用文件来存储数据库的数据和索引。存储层还与存储引擎进行交互,提供数据的持久化存储和访问。

完!!!