MySQL 逻辑架构

73 阅读5分钟

本文首发于公众号:JavaArchJourney

MySQL 逻辑架构

客户端层

主要涉及用户与 MySQL 数据库交互的方式,包括各种类型的客户端应用和接口,如命令行工具(例如 mysql 命令)、图形界面工具(如 phpMyAdmin )、以及通过编程语言提供的数据库连接库(如 Python 的 MySQLdb、Java 的 JDBC 等)。

服务层

MySQL 的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数)。所有跨存储引擎的功能都在这一层实现,包括存储过程、触发器、视图等。

  • 连接管理器:负责连接管理、授权认证、安全等。连接管理器其实并不是 MySOL 所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。
  • 查询缓存:对于 SELECT 语句,在解析査询之前,服务器会先检査査询缓存(Query Cache),如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。但是在实际使用中,查询缓存一般较少使用,因为查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空,而实际工程中大多数表都是经常更新的。
    • 注意:在 MySQL 5.6 及之前的版本中,默认情况下查询缓存是启用的(query_cache_type 参数控制)。从 MySQL 5.7 开始,尽管查询缓存功能仍然存在,但默认情况下它是被禁用的。从 MySQL 8.0 开始,查询缓存已经被完全移除。
  • 查询解析器:负责接收来自客户端的 SQL 语句,检查语法是否正确,并将其分解表示为内部数据结构(解析树)。
  • 查询优化器:生成执行计划,包括重写查询、决定表的读取顺序、选择合适的索引等。优化器并不关心表使用的是什么存储引擎,但存储引擎对于优化査询也是有影响的,优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。用户可以通过特殊的关键字提示(hint)优化器,影响它的决策过程;也可以通过(explain)查看实际的执行计划,发现查询中的潜在问题,如缺失的索引、不必要的全表扫描等,进而优化 SQL 查询以提高数据库性能。
  • 查询执行器:根据优化器选定的执行计划来查询存储引擎。

存储引擎层

存储引擎负责数据的实际存储和检索。MySQL 采用插件式存储引擎架构,允许为不同的表使用不同的存储引擎,最常用的有 InnoDB 、 MyISAM 、 Memory 等。服务器通过 API 与这些存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎 API 包含几十个底层函数,用于执行诸如“开始一个事务”或者“根据主键提取一行记录”等操作,但存储引擎不会去解析 SQL ,不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。

常见的存储引擎:

  • InnoDB:支持事务、行级锁和外键约束,适合于高并发的环境。
    • MySQL 5.6 及之后版本,默认存储引擎是 InnoDB 。
  • MyISAM:不支持事务和外键,但在读操作频繁的场景下性能优越。
    • MySQL 5.5 及之前版本,默认存储引擎是 MyISAM。
  • Memory:所有的数据都保存在内存中,适用于需要快速访问临时数据、且数据量不大的场景。

不同的存储引擎提供不同的功能和性能特点,用户可以根据实际需求选择合适的存储引擎。在实际应用中,大多数业务场景使用 InnoDB 引擎就足够了。

CREATE TABLE 表名称(
  字段名称 数据类型
) ENGINE = 引擎名称; -- 创建表时指定存储引擎

InnoDB 与 MyISAM 对比

特性InnoDBMyISAM
事务支持支持( ACID 兼容)不支持
锁定机制行级锁定表级锁定
外键支持支持不支持
数据索引结构聚簇索引(数据按主键排序存储)非聚簇索引(索引和数据分开存储)
全文索引支持(MySQL 5.6 及之后版本)支持
缓存利用缓冲池缓存数据页和索引页,以减少磁盘I/O操作,提高查询效率仅索引被缓存于内存,数据则依赖操作系统级别的缓存。
崩溃恢复支持自动崩溃恢复(日志先行机制,变更先写 Redo Log,再修改数据。在崩溃恢复时重新应用这些日志来保证数据的一致性和完整性)不支持自动恢复
性能特点插入、更新和删除操作效率高(因为支持行级锁,高并发下不用锁定全表)读取操作效率高,尤其是全表扫描(数据与索引分离存储和简单的表结构设计,使得在执行全表扫描时能够直接顺序读取数据文件)
默认存储引擎MySQL 5.5 及以后版本默认MySQL 5.5 之前版本默认
适用场景高并发、需要事务处理的应用读密集型、不需要事务支持的应用

参考