1、MySQL分层结构由哪些组成?
MySQL按照功能模块可以分为3层:连接层、服务层和存储引擎层。
连接层位于Server服务层的最外层,负责与客户端的直接交互,从功能上单独划分一层更合适。
不同的存储引擎在存储层有不同的实现,存储引擎层和存储层二者紧密相关,所以这里存储引擎层包含存储层。
2、连接层
连接层负责处理客户端与MySQL服务器之间的连接管理,包括连接管理、认证和授权。
连接管理: 当客户端连接到MySQL时,连接层会为每个连接分配一个线程。这个线程处理与该客户端的所有交互。
认证和授权: 通过用户名和密码验证客户端,并检查客户端的权限是否足够执行某些SQL操作。如果用户名或密码错误,会收到“Access denied for user”错误,客户端程序结束执行。如果验证通过,连接器会权限表查出用户名对应的权限,连接未断连之前,权限逻辑不会改变。
3、服务层
服务层主要包含MySQL的核心服务功能,如SQL解析、优化、执行,存储过程等。这个层次还包括内置的功能如视图、触发器和存储过程等。
3.1、查询缓存
查询缓存是 MySQL 的一个机制,缓存完整的查询结果。当一个相同的查询再次被提交时,如果缓存中有相应的结果,并且底层表的数据没有发生变化,就会直接返回缓存的结果,不需要再经过解析、优化和执行的过程。这样可以极大地提高查询效率,特别是在读取频繁且数据不经常变动的场景下。
缓存位置:查询缓存属于 MySQL Server 层的全局缓存,跟存储引擎无关,多个存储引擎共享同一个缓存。
缓存命中条件:
- 完整的 SQL 语句必须完全一致(包括大小写和空格),否则无法命中缓存。
- 查询涉及的表在缓存时间内不能发生更新、插入或删除等变更操作,否则缓存会失效。
MySQL 在 5.7 版本后,已经废弃了查询缓存,原因是它对并发查询场景下的性能提升有限,甚至在某些高并发场景下会产生负面影响,锁定了整个缓存,使其成为性能瓶颈。实际使用场景可以使用其他缓存机制(如Redis)加速查询性能。
3.2、SQL解析器
对SQL语句做解析
第一步:词法分析,识别关键字、表名等,
第二步:语法分析,根据语法规则,判断SQL语句是否满足MySQL语法。
第三步:语法正确情况下,生成语法树。
3.3、查询优化器
查询优化器负责决定SQL语句的执行计划。在执行之前,MySQL会根据可用的索引、表的统计信息、查询条件等进行优化。优化器的目标是找到执行代价最低的方案,例如选择合适的索引或表连接顺序。
查询重写:优化器有时会对查询进行重写,以简化查询或提高执行效率。
代价模型:优化器基于代价模型,估算不同执行计划的代价,并选择代价最低的执行计划。
3.3、查询执行器
执行之前先判断是否有权限,如果没有权限,返回没权限的错误;如果有权限,打开表继续执,根据表的引擎定义,使用引擎定义的接口。
4、存储引擎层
MySQL的存储引擎层是MySQL架构中最灵活的部分之一,不同的存储引擎负责数据的存储和提取。MySQL支持多种存储引擎,用户可以根据具体应用场景选择不同的存储引擎。
每个存储引擎都有自己的实现方式、数据结构和存储格式,但通过统一的API接口(称为存储引擎API)与上层进行交互。
常见的存储引擎包括:
- InnoDB:MySQL默认的事务型存储引擎,支持ACID事务特性,行级锁和外键约束,并且支持多版本并发控制(MVCC)。
- MyISAM:不支持事务和外键约束,适用于读多写少的应用场景,表级锁定。
- Memory:将数据存储在内存中,适用于需要高速访问但数据量较小的场景。
- NDB:分布式数据库引擎,主要用于高可用的集群环境。
5、总结
至此MySQL系列7篇已完结,前面六篇链接如下:
《Explain-MySQL分析和优化查询的核心工具》
《MySQL存储引擎InnoDB、索引和索引下推》
《MySQL事务原理和MVCC多版本并发控制》
《浅谈MySQL锁机制和锁优化小Tips》
《MySQL为什么会有redo log和binlog两份日志》
《MySQL其他四种日志:回滚、错误、通用查询和慢查询日志》
后续会继续分享JVM、Redis专题和其他Java系列的笔记,敬请关注。
6、我的公众号
敬请关注我的公众号:大象只为你,持续更新技术知识…