Skip to content

MySQL 的底层结构

约 1077 字大约 4 分钟

MySQL字节

2025-03-20

⭐ 题目日期:

字节 - 2024/12/10

📝 题解:

MySQL 的底层结构是一个分层架构,从客户端请求到数据存储的整个流程涉及多个组件协作。以下是其核心组成部分的详细解析:


1. 整体架构分层

MySQL 可分为四层:

  • 连接层:处理客户端连接、认证、权限管理。
  • 服务层:负责 SQL 解析、优化、缓存、内置函数。
  • 存储引擎层:负责数据的存储、索引、事务实现(如 InnoDB)。
  • 存储层:数据最终存储在磁盘文件或内存中。

2. 核心组件详解

2.1 连接层

  • 线程管理:通过线程池处理客户端连接(如 Java 的 Connector/J)。
  • 认证与权限:验证用户名/密码,检查操作权限。
  • 协议支持:支持 TCP/IP、Socket、命名管道等连接方式。

2.2 服务层

  • SQL 接口:接收 SQL 命令(如 SELECTINSERT),返回结果。
  • 解析器(Parser)
    • 词法分析:拆分 SQL 为关键字、表名、字段等。
    • 语法分析:生成抽象语法树(AST),检查语法错误。
  • 优化器(Optimizer)
    • 选择最优执行计划(如索引选择、JOIN 顺序)。
    • 基于成本模型(CPU、I/O 开销)优化。
  • 查询缓存(Query Cache)(注:MySQL 8.0 已移除):
    • 缓存 SELECT 结果,以 Key-Value 形式存储(Key 是 SQL 语句哈希值)。

2.3 存储引擎层

  • 插件式设计:支持 InnoDB、MyISAM、Memory 等引擎。
  • 核心引擎 InnoDB
    • 缓冲池(Buffer Pool):缓存热数据页(默认大小 128MB),减少磁盘 I/O。
    • 事务支持:通过 Redo Log(重做日志)和 Undo Log(回滚日志)实现 ACID。
    • 锁机制:行级锁、间隙锁(Gap Lock)、Next-Key Lock(解决幻读)。
    • MVCC:多版本并发控制,通过隐藏的 DB_TRX_IDDB_ROLL_PTR 字段实现非阻塞读。

2.4 存储层

  • 物理文件结构
    • 表空间(Tablespace)
      • 系统表空间(ibdata1):存储元数据、Undo Log。
      • 独立表空间(*.ibd):每张表单独存储(默认启用)。
    • 段(Segment):数据段(B+树叶子节点)、索引段(非叶子节点)。
    • 区(Extent):连续页的集合(1 区 = 64 个页,默认 1MB)。
    • 页(Page):最小存储单元(默认 16KB),存储行数据或索引。
  • 索引结构
    • B+树索引:所有数据按主键排序存储(聚簇索引)。
    • 二级索引:叶子节点存储主键值,查询时需回表。

3. 关键日志系统

  • Binlog(归档日志)
    • 逻辑日志,记录所有写操作(用于主从复制、数据恢复)。
    • 格式:STATEMENT(SQL 语句)、ROW(行数据变更)、MIXED
  • Redo Log(重做日志)
    • 物理日志,记录数据页的修改(保证事务持久性)。
    • 循环写入,通过 innodb_flush_log_at_trx_commit 控制刷盘策略。
  • Undo Log(回滚日志)
    • 存储事务前的数据旧版本,用于回滚和 MVCC。

4. 事务与锁机制

  • 事务流程
    1. 开启事务(BEGIN)。
    2. 生成 Undo Log。
    3. 修改数据,记录 Redo Log。
    4. 提交事务(Redo Log 刷盘)或回滚(通过 Undo Log 恢复)。
  • 隔离级别
    • READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READ(默认) → SERIALIZABLE
  • 锁竞争
    • 行锁通过索引实现,无索引时退化为表锁。
    • 死锁检测:通过等待图(Wait-for Graph)检测并回滚代价小的事务。

5. 内存管理

  • Buffer Pool
    • 缓存数据页,采用 LRU 算法淘汰冷数据。
    • 通过 innodb_buffer_pool_size 配置大小(建议为物理内存的 70-80%)。
  • Change Buffer
    • 缓存非唯一索引的变更(如 INSERTUPDATE),减少随机 I/O。
  • Log Buffer
    • 缓存 Redo Log,定期刷盘(通过 innodb_log_buffer_size 配置)。

6. 物理文件示例

  • 数据文件
    • *.ibd:InnoDB 表的数据和索引。
    • *.frm:表结构定义(MySQL 8.0 后移除,元数据存于数据字典)。
  • 日志文件
    • ib_logfile0/1:Redo Log。
    • mysql-bin.000001:Binlog。
  • 配置文件my.cnf(Linux)或 my.ini(Windows)。

7. 总结

  • 分层协作:客户端请求依次经过连接层→服务层→存储引擎层→磁盘。
  • 性能关键:Buffer Pool 减少磁盘 I/O,B+树索引加速查询,Redo Log 保证事务持久性。
  • 扩展性:插件式存储引擎设计,支持不同场景需求(如 InnoDB 适合 OLTP,MyISAM 适合读密集型场景)。

通过理解底层结构,可以更好地优化 SQL、设计索引、配置参数(如缓冲池大小),并解决锁竞争、死锁等问题。