Mysql内部有哪些核心模块组成,作用是什么?
MySQL的内部核心模块主要包括以下几个部分,各自承担着不同的作用,让我们根据下图来分析一下:
Connectors(客户端)
MySQL服务器之外的客户端程序,与具体的语言相关,例如Java中的JDBC,图形用户界面SQLyog等。本质上都是在TCP连接上通过MySQL协议和MySQL服务器进行通信。
MySQL Server(服务器)
第一层:连接层
连接层主要负责处理客户端的连接请求,包括连接处理、身份验证以及安全性等。它是MySQL与客户端进行交互的入口,确保只有经过认证的客户端才能访问数据库。
- 系统(客户端)访问 MySQL 服务器前,做的
第一件事就是建立 TCP 连接
。 - 经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做
身份认证、权限获取
。
- 用户名或密码不对
,会收到一个
Access denied for user错误,客户端程序结束执行
用户名密码认证通过
,会从权限表查出账号拥有的权限
与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限
- TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。
核心服务层(Server层/SQL Layer)
连接管理器
负责处理客户端的连接请求,包括连接认证和授权。当客户端尝试连接到MySQL服务器时,连接管理器会验证客户端的身份,并根据配置决定是否允许连接。
查询缓存(在MySQL 8.0及更高版本中被废弃)
在较早的MySQL版本中,查询缓存用于存储已经执行过的查询及其结果。如果相同的查询再次被执行,MySQL可以直接从查询缓存中获取结果,从而提高查询效率。然而,由于查询缓存的维护成本较高,且在某些情况下可能导致性能下降,因此在MySQL 8.0及更高版本中被废弃。
分析器
负责对SQL语句进行词法分析和语法分析。词法分析主要是提取SQL语句中的关键字和自定义字段,而语法分析则判断SQL语句是否符合MySQL的语法规则。如果语法错误,分析器会返回错误信息。
优化器
在分析器之后发挥作用,它运用各种优化技术来提高查询效率。优化器会根据统计信息和执行成本来选择最优的执行计划,包括选择合适的索引、连接顺序等。执行计划是指导执行器如何执行SQL语句的详细步骤。
执行器
负责将优化后的SQL语句转化为实际的数据库操作。执行器会根据执行计划调用存储引擎的API来执行具体的数据库操作,如插入、更新、删除数据等。执行器还会处理事务的提交和回滚等操作。
服务管理和公共组件
提供了数据备份与恢复、安全组件、主从复制和集群管理、表分区等实用功能。这些功能确保了MySQL数据库的高可用性、数据完整性和安全性。
存储引擎层(引擎层/存储层)
存储引擎层负责数据的存储和提取,是MySQL架构中的底层部分。MySQL支持多种存储引擎,如InnoDB、MyISAM、Memory等,每种存储引擎都有自己的优点和缺陷,可以根据不同的应用场景选择合适的存储引擎。
- InnoDB:MySQL的默认存储引擎,支持事务、外键、行锁等高级特性,适用于需要高并发和数据一致性的应用场景。
- MyISAM:适用于读操作频繁的场景,但在写操作和事务支持方面不如InnoDB。
- Memory:将数据存储在内存中,读写速度非常快,但数据在服务器重启时会丢失,适用于临时数据存储的场景。
其他核心模块
除了上述三个主要层次外,MySQL还包括一些其他核心模块,如:
服务器初始化模块:负责在MySQL服务器启动时完成初始化工作,如加载配置文件、分配全局存储缓冲区等。
线程管理器:管理线程的创建、销毁和复用,以减少线程频繁创建和销毁带来的开销。
命令调度器:负责将客户端请求转发给相应的处理模块,如解析器、优化器等。
日志记录模块:负责维护MySQL的日志信息,包括二进制更新日志、命令日志、缓慢查询日志等,用于数据恢复、故障排查等目的。
复制模块:支持MySQL的主从复制功能,实现数据的备份和读写分离。