mysql是我们开发过程中使用的最多的数据库,大多数程序员平时都是做CRUD,如果CRUD慢了,那就再加一个索引,如果加上索引还不行,那基本上开发就没辙了,因为对mysql内部理解不深入、不清晰,所以问题无从下手,比如,涉及存储引擎、执行计划、缓存之类的优化和调试,这类内容最后还是得专业的DBA来做。
但是,如果我们开发自己也能来做,一来可以提升自己的技术能力和技术深度,二来可以获得更好的职场上升机会,从而获得更多的加薪,所以我们开发不仅要会使用mysql,还要深入了解mysql,至少也得知道mysql由哪几块组成,每一个块的职责是什么,遇到问题时也有排查方向。
本文的核心内容就是梳理mysql的逻辑架构图,分别说明mysql逻辑架构中每一块的工作内容和职责。见下图mysql逻辑架构图:
这是一个包含了各种管理和监控工具的组件,它主要用于提供对MySQL数据库的管理、监控和维护功能。
首先是Services,Services主要负责处理来自客户端的连接请求,包含了MySQL的大多数核心服务,包括验证用户的身份、连接器、查询缓存、分析器、优化器、执行器等,以及负责SQL语句的解析、优化、缓存查询以及所有内置函数(如日期、时间、加密函数等)的实现,同时Service层也负责实现所有跨存储引擎的功能,如存储过程、触发器和视图等。
其次是Utilities,这里包含一些用于数据库备份和恢复、数据导入导出、性能监控和分析、安全管理等方面的工具,这些工具可以通过命令行或图形用户界面访问,并提供了一系列功能和选项,以满足不同用户的需求,常见的Utilities包括:
连接池的首要作用是复用已经创建的数据库连接,这样,当一个新的请求来临时,它不需要重新走完整的TCP三次握手流程,直接从连接池里取出一个空闲连接来使用,大大提升了处理速度。可以设定连接的最大数量,防止因为过多的数据库连接导致服务器资源耗尽。当数据库服务器负载过高时,通过连接池的限制可以避免过多的连接请求对数据库造成影响,保证了数据库的稳定运行。它具有以下核心参数:
除了上述参数外,还有其他与连接池相关的参数,如innodb_thread_concurrency等,它用于控制InnoDB存储引擎内部的并发线程数量。
它是整个数据系统与用户进行交互的关键部分,负责接收并处理用户的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再把这些结果组织起来,并最终返回给用户。
SQL Parser负责将用户输入的SQL命令转换成MySQL内部可以理解的指令。同时将其转换成内部的数据结构,并为后续的查询优化和执行提供必要的信息。它主要做以下几件事情:
它的作用至关重要,负责优化SQL查询的执行计划,以提高性能和效率,直接影响数据库查询的执行方式和速度。
此外,MySQL也提供了一些工具供我们查看和分析优化器的工作过程,例如Optimizer Trace特性。通过开启Optimizer Trace,可以将优化器的决策和执行过程输出为文本形式,帮助我们更好地理解和控制优化器的行为。
虽然MySQL的优化器非常强大,但也有其局限性。比如对于包含count()+group by之类的sql,MySQL的优化效果可能不尽如人意。
它主要用于缓存查询结果,以提高查询性能。
当SQL Optimizer生成了一个优化后的查询计划后,它就会将这个查询计划传递给存储引擎执行。存储引擎会根据这个查询计划来检索出所需的数据,并将结果返回给SQL Optimizer。此时,SQL Optimizer会选择是否将这个查询结果缓存在Cache中。如果选择了缓存,则下次遇到相同的查询时,就可以直接从缓存中获取结果,而无需再次访问磁盘上的数据文件。
Caches的使用对于提升MySQL性能非常重要,但也有一些需要注意的地方:
为了合理利用查询缓存,我们需要理解并掌握一些相关的参数和设置。例如,可以通过设置query_cache_limit
参数来限制可缓存具体查询结果的最大值;通过设置query_cache_size
参数来调整查询缓存的大小;通过设置query_cache_type
参数来决定是否启用查询缓存等。
MySQL最显著的特点是采用了插件式的存储引擎体系结构。
Pluggable Storage Engines是一个用于管理不同类型的数据库存储引擎的关键组件。它使得MySQL能够支持多种不同的数据存储方式,以满足不同场景下的需求。这意味着服务器中的查询执行引擎通过API接口与存储引擎进行通信,而这个接口则屏蔽了不同存储引擎之间的差异。因此,无论使用哪种存储引擎,对于上层的应用来说,都可以保持相对的一致性和简单性。 具体来说,MySQL中的存储引擎是指负责处理数据存储和检索操作的底层程序。每个存储引擎都有其特定的优点和缺点,适用于不同的应用场景。例如,MyISAM存储引擎适合于读取密集型的应用场景,而InnoDB存储引擎则适合于写入密集型的应用场景。 为了方便用户选择和使用合适的存储引擎,MySQL引入了Pluggable Storage Engines的概念。通过这个组件,用户可以在运行时动态地加载和卸载不同的存储引擎,以满足不同的应用需求。
这块区域包含两部分内容,
1、日志(Logs),日志是MySQL数据库中用于记录数据库操作和事务的重要工具。它们帮助数据库管理员跟踪数据库活动,进行故障恢复,以及优化数据库性能。在MySQL中,主要有以下几种类型的日志:
2、文件(Files):
在MySQL数据库中,文件是用来存储数据和元数据的。主要有以下几种类型的文件:
logs和files在MySQL数据库架构中扮演着重要的角色。它们帮助维护数据库的稳定性和可靠性,并提供诊断、监控和管理数据库的工具和方法。在使用和管理MySQL数据库时,理解这些日志和文件的用途和特点是非常重要的。
这块内容比较简单,指用来支撑MySQL运行的文件系统,比如运行在linux需要ext4文件系统支持,运行在window上需要NFTS文件系统支持,
MySQL的逻辑架构可以分为几个层次,每个层次都有特定的功能和组件:
完!!!