
文章插图
MySQL总体上可分为Server层和存储引擎层 。
Server层包括连接器、查询器、分析器、优化器、执行器等 , 涵盖 MySQL 的大多数核心服务功能 , 以及所有的内置函数(如日期、时间、数学和加密函数等) , 所有跨存储引擎的功能都在这一层实现 , 比如存储过程、触发器、视图等 。
存储引擎层负责数据的存储和提取 。其架构模式是插件式的 , 支持 InnoDB、MyISAM、Memory 等多个存储引擎 。
如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图 , 有助于深入理解MySQL服务器 。下图展示了MySQL的逻辑架构图 。

文章插图
MySQL 整体上可以分为 Server 层和存储引擎层两部分 。详细的分层如下:
1.客户端层:连接处理、授权认证、安全等功能均在这一层处理 。包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信 。主要完成一些类似于连接处理、授权认证、及相关的安全方案 。在该层上引入了线程池的概念 , 为通过认证安全接入的客户端提供线程 。同样在该层上可以实现基于SSL的安全链接 。服务器也会为安全接入的每个客户端验证它所具有的操作权限 。
2.核心服务层:查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)等 。该层架构主要完成核心服务功能 , 如SQL接口 , 并完成缓存的查询 , SQL的分析和优化及部分内置函数的执行 。所有跨存储引擎的功能也在这一层实现 , 如过程、函数等 。在该层 , 服务器会解析查询并创建相应的内部解析树 , 并对其完成相应的优化如确定查询表的顺序 , 是否利用索引等 , 最后生成相应的执行操作 。如果是select语句 , 服务器还会查询内部的缓存 。如果缓存空间足够大 , 这样在解决大量读操作的环境中能够很好的提升系统的性能 。
3.存储引擎层:存储过程、触发器、视图等 。存储引擎真正的负责了MySQL中数据的存储和提取 , 服务器通过API与存储引擎进行通信 。不同的存储引擎具有的功能不同 , 这样我们可以根据自己的实际需要进行选取 。
4.数据存储层 , 主要是将数据存储在运行于裸设备的文件系统之上 , 并完成与存储引擎的交互 。
最下层为存储引擎 , 其负责MySQL中的数据存储和提取 。和linux下的文件系统类似 , 每种存储引擎都有其优势和劣势 。中间的服务层通过API与存储引擎通信 , 这些API接口屏蔽了不同存储引擎间的差异 。
MySQL查询过程
我们总是希望MySQL能够获得更高的查询性能 , 最好的办法是弄清楚MySQL是如何优化和执行查询的 。一旦理解了这一点 , 就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已 。
当向MySQL发送一个请求的时候 , MySQL到底做了些什么呢?

文章插图
【MySQL 整体架构与 SQL 执行原理】客户端/服务端通信协议
MySQL客户端/服务端通信协议是“半双工”的:在任一时刻 , 要么是服务器向客户端发送数据 , 要么是客户端向服务器发送数据 , 这两个动作不能同时发生 。一旦一端开始发送消息 , 另一端要接收完整个消息才能响应它 , 所以我们无法也无须将一个消息切成小块独立发送 , 也没有办法进行流量控制 。
客户端用一个单独的数据包将查询请求发送给服务器 , 所以当查询语句很长的时候 , 需要设置max_allowed_packet参数 。但是需要注意的是 , 如果查询实在是太大 , 服务端会拒绝接收更多数据并抛出异常 。
与之相反的是 , 服务器响应给用户的数据通常会很多 , 由多个数据包组成 。但是当服务器响应客户端请求时 , 客户端必须完整的接收整个返回结果 , 而不能简单的只取前面几条结果 , 然后让服务器停止发送 。因而在实际开发中 , 尽量保持查询简单且只返回必需的数据 , 减小通信间数据包的大小和数量是一个非常好的习惯 , 这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一 。
推荐阅读
- mysql千万级数据量插入的几种方案耗时,看完就知道如何选择
- MySQL的优化,看这篇文章就够了
- PHP的微服务框架预览
- MySQL性能优化分区之实战
- MacOS下brew安装mysql5.7数据库
- 电商支付架构设计
- 详解Docker架构原理、功能及使用
- mysql导入数据,涉及到时间转换,乱码问题解决
- 如何基于 MySQL 主从模式搭建上万并发的系统架构?
- 你知道CentOS 6和 CentOS 7的区别吗?
