MySQL【架构篇】
MySQL也采用经典的CS架构,其核心服务运行在一个主进程中,通过多线程模型处理并发请求。逻辑上,MySQL架构分为:连接层、服务层、存储引擎层和存储层,每层功能由若干线程完成。
- 连接层:连接管理、认证、权限控制。
- 服务层:缓存、解析器、优化器、执行器。
- 存储引擎层:底层存储引擎,负责数据的存储和检索等操作逻辑。
- 存储层:负责数据物理存储,与存储引擎无关。
为什么要选择MySQL?
我在一个聊天室项目中使用了MySQL,后来在一次京东面试中被问到这个问题?这问题可以拆解为:
- 怎么进行数据库选型的?(数据是否高度结构化?)
- 为什么选择关系型数据库?(数据结构化、事务支持)
- 为什么选择MySQL?而不是其他关系型数据库?(性能、社区支持、开源)
- MySQL适合什么存储场景,有什么优势?(中小型数据量(TB以下)、读多写少、数据结构化)
- MySQL的缺点是什么?什么场景下不适合使用MySQL?(大数据量(TB以上)、写多读少、数据非结构化、复杂查询)
在MySQL中,一条读/写请求是怎么执行的?
mysql> select * from user where id = 1;
实际是考察MySQL架构。
连接层
客户端需要先连接到MySQL服务器,才能执行读写请求。这部分工作由连接层完成:
- 连接管理:负责接收客户端的连接请求,分配连接线程,维护连接池。
- 认证:验证客户端的身份,确保只有合法用户才能访问数据库。
- 权限控制:根据用户角色和权限,控制对数据库的访问。
- 连接池:为了提高性能,复用连接,减少连接创建和销毁的开销。
服务层
服务层负责处理查询缓存,SQL语句的解析、预处理、优化和执行。
- 查询缓存:存储语句和结果集的映射关系,避免重复执行相同的查询,提高性能。
- 解析器:将SQL语句解析成语法树,检查语法和语义错误。
- 预处理器:将解析后的语法树转换为执行计划,检查表和字段的存在性。
- 优化器:根据查询的复杂度和数据量,选择最优的执行计划,决定如何访问数据。
- 执行器:根据优化器生成的执行计划,执行查询操作,返回结果集。
存储引擎层
存储引擎层负责数据的存储和检索逻辑。最常用的包括:
- InnoDB:支持事务、行级锁、外键约束,适合高并发和复杂查询场景。底层使用B+树索引。
- MyISAM:不支持事务、表级锁,适合读多写少的场景。底层使用B树索引。
存储层
存储层负责数据的物理存储,和存储引擎无关。
- 数据文件:存储数据的文件,通常是二进制格式。
- 日志文件:存储操作日志,用于数据恢复和事务管理。
- 索引文件:存储索引信息,加速数据检索。