MySQL 逻辑架构
Last updated: Oct 19, 1119
问
日常生活中比较常用的 RDBMS 是 MySQL,那你知道 MySQL 的内部结构吗?
答
整体结构
需要强调的是,MySQL 与其他 RDBMS 最重要的区别是它的存储引擎架构。
MySQL 架构设计是将 查询处理及其他系统任务 和 数据的存储/提取 相分离。
MySQL 的逻辑架构大体上分为 Server 层和 存储引擎 两个部分,如下图:
Server 层
- 连接器、查询缓存、分析器、优化器和执行器等,大多数的核心服务功能
- 所有的内置函数 (日期、时间、数学和加密函数)
- 所有跨存储引擎的功能,如存储过程、触发器和视图等
存储引擎层
- 负责数据等存储和提取,服务器通过 API 与存储引擎通信
- 架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎
- 5.5 版本开始,默认使用的是 InnoDB 引擎
具体组件
连接器
管理连接,权限验证。
每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在该线程中执行。
当客户端连接到 MySQL 服务器时,服务器需要对其进行认证,基于用户名、原始主机信息和密码,如下:
mysql -h$ip -P$port -u$user -p
如果接下来输入的密码不对,则会收到 “Access denied for user” 的错误。
如果认证通过,连接器会到权限表中查询该用户的权限,之后所有请求都基于这个权限。
查询缓存
命中则直接返回结果。
MySQL 在分析完查询请求后,先到查询缓存中查看是否之前执行过,如果是的话,直接返回结果给客户端。
查询缓存的失效非常频繁,是因为只要对一个表进行更新,该表上所有的查询缓存都会清空。
NOTE:MySQL 8.0 版本已经将查询缓存的功能删掉了。
分析器
词法分析,语法分析。
对 SQL 语句进行词法分析和语法分析等,并创建内部数据结构 (解析树),使之成为 MySQL 能够理解的内容。
优化器
执行计划生成,索引选择。
如果表有多个索引,优化器需要选择合适的索引。
如果存在多表关联,优化器需要决定表的连接顺序。
如何查看优化过程:使用 explain 语句
执行器
操作引擎,返回结果。
首先需要判断对将要执行的表是否有相应的权限,有的话继续按照执行,使用下层存储引擎提供的接口。
存储引擎
存储数据,提供读写接口。