MySQL 架构与存储引擎
MySQL 体系架构
MySQL 的架构分为四层,各层各司其职:
客户端连接(Connectors)
↓
┌─────────────────┐
│ 连接层(Connection)│ ← 连接池、认证、SSL
├─────────────────┤
│ 服务层(Server) │ ← 查询缓存、解析器、优化器、执行器
├─────────────────┤
│ 引擎层(Engine) │ ← 插件式存储引擎(InnoDB、MyISAM 等)
├─────────────────┤
│ 存储层(Storage) │ ← 文件系统、磁盘数据
└─────────────────┘连接层
- 管理客户端连接(TCP/IP、Socket、命名管道)
- 连接池复用线程,避免频繁创建销毁
- 认证用户身份与权限校验
服务层
- 查询缓存:8.0 之前缓存 SELECT 结果(已移除)
- 解析器:SQL 语法解析,生成解析树
- 优化器:选择最优执行计划(索引选择、JOIN 顺序)
- 执行器:调用存储引擎接口,返回结果
引擎层
- 插件式架构,支持多种存储引擎
- InnoDB(默认)、MyISAM、Memory、CSV、Archive 等
- 每种引擎有自己的存储方式和锁策略
存储层
- 数据持久化到磁盘(
.ibd文件) - 文件系统交互(ext4、NTFS、xfs)
InnoDB 存储引擎
InnoDB 是 MySQL 5.5+ 的默认存储引擎,具备以下核心特性:
B+ 树索引
InnoDB 使用 B+ 树组织索引和数据:
| 概念 | 说明 |
|---|---|
| 聚簇索引 | 主键索引,叶子节点存储整行数据 |
| 二级索引 | 非主键索引,叶子节点存储主键值 |
| 页 | 默认 16KB,B+ 树的基本存储单位 |
| 页分裂 | 插入导致页满时分裂为两页 |
缓冲池(Buffer Pool)
- 内存中的缓存区域,缓存数据页和索引页
- 通过 LRU 变体 算法管理冷热数据
- 减少磁盘 I/O,大幅提升读性能
innodb_buffer_pool_size通常设置为物理内存的 60%-80%
Change Buffer
- 缓存对非唯一二级索引的变更(INSERT、UPDATE、DELETE)
- 在页被读取到 Buffer Pool 时再合并(Merge)
- 减少随机 I/O,提升写性能
自适应哈希索引(AHI)
- InnoDB 自动为频繁访问的索引页建立哈希索引
- 加速等值查询(
WHERE a = xxx) - 完全自动,无需人工干预
事务
ACID 特性
| 特性 | 说明 | 实现机制 |
|---|---|---|
| 原子性(A) | 事务要么全部成功,要么全部回滚 | Undo Log |
| 一致性(C) | 事务前后数据保持完整约束 | 应用层 + 数据库约束 |
| 隔离性(I) | 并发事务互不干扰 | MVCC + 锁 |
| 持久性(D) | 提交后数据永久保存 | Redo Log |
事务隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 | 实现方式 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✅ | ✅ | ✅ | 直接读最新数据 |
| READ COMMITTED | ❌ | ✅ | ✅ | 每语句生成 ReadView |
| REPEATABLE READ(默认) | ❌ | ❌ | ✅ | 每事务生成 ReadView |
| SERIALIZABLE | ❌ | ❌ | ❌ | 加锁串行化 |
MVCC(多版本并发控制)
MVCC 是 InnoDB 实现高并发读的核心机制:
核心组件:
- 隐藏字段:
DB_TRX_ID(事务 ID)、DB_ROLL_PTR(回滚指针) - Undo Log:记录数据行的历史版本链
- ReadView:事务执行时的可见性快照
工作原理:
- 每次修改数据时,旧版本写入 Undo Log
- 查询时通过 ReadView 判断可见版本
- REPEATABLE READ 级别下,事务首次查询时固定 ReadView
Redo Log(重做日志)
- 保证事务的持久性
- WAL(Write-Ahead Logging):先写日志,后写数据
ib_logfile0/ib_logfile1循环写入- 崩溃恢复时重放 Redo Log 恢复未写入磁盘的数据
Undo Log(回滚日志)
- 保证事务的原子性和 MVCC 的一致性读
- 记录数据修改前的旧值
- 事务回滚时撤销已执行的修改
MyISAM vs InnoDB
| 对比维度 | MyISAM | InnoDB |
|---|---|---|
| 事务支持 | ❌ | ✅ |
| 行级锁 | ❌(表锁) | ✅ |
| 外键 | ❌ | ✅ |
| 聚簇索引 | ❌ | ✅ |
| 全文索引 | ✅ | ✅(5.6+) |
| 缓存 | 仅缓存索引 | 缓存数据 + 索引 |
| 存储文件 | .MYD + .MYI | .ibd(共享表空间或独立) |
| 适合场景 | 读多写少、数据仓库 | OLTP、高并发读写 |