浅谈Mysql的整体架构以及核心组件

96 阅读4分钟

MySQL的整体架构可以分为四层连接层服务层(也称SQL层或核心服务层)、存储引擎层文件系统层。每一层都有其特定的职责和核心组件。


1. 连接层 (Connection Layer)

作用:负责客户端与MySQL服务器之间的通信,管理连接、认证和安全。

核心组件及作用

  • 连接池 (Connection Pool)
    • 管理客户端的连接请求,复用连接以减少创建和销毁连接的开销。
    • 维护线程池,为每个连接分配工作线程。
  • SSL (Secure Sockets Layer)
    • 提供加密通信,确保数据在传输过程中的安全性。
  • 用户认证 (Authentication)
    • 验证客户端的用户名、密码以及主机权限,确保只有授权用户才能访问数据库。

2. 服务层 (Service Layer / SQL Layer)

作用:处理SQL查询的解析、优化、执行计划生成等核心逻辑,是MySQL的核心处理层。

核心组件及作用

  • 连接器 (Connector)
    • 负责与客户端建立连接,验证用户身份,获取用户权限。
    • 维护连接的有效性(如超时管理)。
  • 查询缓存 (Query Cache)注意:自MySQL 8.0起已移除):
    • 缓存 SELECT 查询的结果,如果后续查询相同,可直接返回结果,提高性能。
  • 解析器 (Parser)
    • 将SQL语句进行词法和语法分析,生成解析树(Parse Tree)。
    • 验证SQL语句是否符合MySQL语法规则。
  • 预处理器 (Preprocessor)
    • 对解析树进行语义检查,如验证表名、列名是否存在,用户是否有权限访问等。
  • 优化器 (Optimizer)
    • 这是服务层最核心的组件之一。
    • 根据解析树生成多个可能的执行计划,并选择成本最低(最快)的执行计划。
    • 涉及索引选择、连接顺序、访问方式(全表扫描 vs 索引扫描)等决策。
  • 执行器 (Executor)
    • 执行优化器生成的执行计划。
    • 调用存储引擎层的API进行数据的读取、写入、更新和删除操作。
    • 验证用户对操作的数据表是否有相应的权限(如INSERT、UPDATE权限)。

3. 存储引擎层 (Storage Engine Layer)

作用:负责数据的物理存储和读取,不同的存储引擎提供不同的存储机制、索引方式、事务支持等。

核心组件及作用

  • 存储引擎接口 (Storage Engine API)
    • 服务层通过统一的接口与存储引擎交互,屏蔽底层实现的差异。
  • 常见存储引擎
    • InnoDB
      • 作用:支持事务(ACID)、行级锁、外键、崩溃恢复。
      • 特点:使用聚集索引,数据按主键顺序存储,适合高并发、需要事务完整性的场景。
    • MyISAM
      • 作用:不支持事务和行级锁,支持表级锁。
      • 特点:查询速度快,但并发写入性能差,适合读多写少的场景(MySQL 5.5之前默认引擎)。
    • Memory (HEAP)
      • 作用:将数据存储在内存中,访问速度极快。
      • 特点:数据易失,服务器重启后数据丢失,适合临时表或缓存。
    • 其他引擎:如Archive(用于归档)、CSV、Blackhole等,适用于特定场景。

4. 文件系统层 (File System Layer)

作用:负责数据的最终物理存储,MySQL通过操作系统文件系统将数据持久化到磁盘。

核心组件及作用

  • 数据文件 (Data Files)
    • .ibd 文件(InnoDB独立表空间)、.frm 文件(表结构定义,MySQL 8.0后已移除)。
  • 日志文件 (Log Files)
    • 重做日志 (Redo Log):InnoDB特有,用于保证事务的持久性,记录物理页的修改,用于崩溃恢复。
    • 回滚日志 (Undo Log):InnoDB特有,用于实现事务的原子性和MVCC(多版本并发控制)。
    • 二进制日志 (Binary Log):记录所有更改数据的SQL语句或行更改,用于主从复制和数据恢复。
    • 错误日志 (Error Log):记录MySQL启动、运行、关闭过程中的错误信息。
    • 慢查询日志 (Slow Query Log):记录执行时间超过指定阈值的SQL语句,用于性能分析。
  • 配置文件 (Configuration Files)
    • my.cnfmy.ini,存储MySQL的配置参数。

总结:数据查询流程示例

  1. 客户端发起连接请求 → 连接层认证并建立连接。
  2. 发送SQL查询语句 → 服务层解析器解析SQL,优化器生成执行计划,执行器调用存储引擎接口。
  3. 存储引擎层(如InnoDB)根据执行计划,通过索引查找数据页。
  4. 数据页从文件系统层的磁盘文件中读取到内存。
  5. 结果返回给客户端。

这种分层架构使得MySQL具有良好的可扩展性和灵活性,各层职责清晰,便于维护和优化。