跟SqlServer的架构包括其中的组件很类似,
上图来自 https://www.mysql.com/common/images/PSEA_diagram.jpg
可以看到MySQL Server 体系结构也分为四层:
- 网络连接层
- 关系引擎层(核心服务层)
- 存储引擎层
- 物理文件层
一、 网络连接层
Connection Pool(连接池)
- 管理缓冲用户连接,线程处理等需要缓存的需求
- 进行用户账号、密码和库表权限验证
二、 关系引擎层(核心服务层)
又分为四类(也类似SqlServer):
- SQL Interface(SQL接口)
- Parser(解析器)
- Optimizer(查询优化器)
- Cache&Buffers(缓存)
1. SQL Interface(SQL接口)
- 接收用户发来的sql语句并返回执行结果
2. Parser(解析器)
- 将sql语句解析成mysql认识的数据结构
- 解析的同时会对sql进行语法检验
3. Optimizer(查询优化器)
- 对sql语句进行优化,同时选出较好的执行计划(注意未必是最好的)
- 使用策略为“选取-投影-联接”
4. Cache&Buffers(缓存)
- 包含query_cache、表缓存、记录缓存、key缓存、权限缓存等
- 查询缓存主要用于MyISAM引擎,并且在8.0版本已废弃。它对于InnoDB引擎没有意义,因为InnoDB有自己的一套缓存机制
- 注意这些是属于服务层的功能,这部分缓存别的存储引擎仍需要用到
三、 存储引擎层
- MySQL有很多种类型的插件式存储引擎,可以根据需要选择。
四、 物理文件层
上述组件是如何协同工作的?来看一个简单的查询在MySQL中的生命周期:
五、 MySQL查询大致流程
- Connectors(即客户端)对MySQL Server的监听端口发起请求
- 在 Connection Pool 创建连接、分配线程,验证用户名密码及库表权限
- 如果打开了query_cache(8.0版本已废弃),进行检查,若有数据则直接返回,没有则继续往下执行
- SQL Interface 接收sql语句并传给Parser进行解析和语法检验
- Optimizer 对sql进行优化并选出较好的执行计划
- 调用存储引擎接口,打开表,执行查询,检查存储引擎缓存中是否有对应缓存记录,有则返回,无则继续执行
- 到磁盘物理文件中寻找数据
- 找到所需数据后,先写回存储引擎缓存。如果打开了query_cache,也会进行写入
- 通过SQL Interface 返回数据给客户端
- 关闭表
- 关闭线程
- 关闭连接
简单了解了MySQL Server 体系结构及查询大致流程,下一篇学习InnoDB存储引擎的体系结构。
参考:《MySQL 性能优化金字塔法则》