MySQL深度解析:架构、存储引擎、InnoDB核心原理
标签:MySQL、关系型数据库、InnoDB、事务、B+树
前言
MySQL是互联网行业使用最广泛的开源关系型数据库,不管是业务系统、后端服务,几乎都离不开MySQL。很多开发只会写SQL,对底层架构、存储引擎、事务原理一知半解,上线后经常遇到慢SQL、锁等待、事务异常、宕机丢数据等问题。
本次MySQL系列分为三篇:
- 第一篇:整体架构、存储引擎选型、InnoDB底层核心原理(重点)
- 第二篇:索引原理、SQL优化、执行计划、慢查询实战
- 第三篇:高可用、主从复制、运维调优、经典线上故障与最佳实践
本篇我们先从MySQL整体架构入手,理解存储引擎差异,吃透InnoDB核心组件。
一、MySQL整体分层架构
MySQL采用插件式存储引擎架构,分为Server层和存储引擎层。Server层是MySQL核心,负责连接、权限、SQL解析优化;存储引擎负责数据读写,不同引擎实现不同。
MySQL架构分层表
| 分层 | 组件 | 核心职责 |
|---|---|---|
| 连接层 | 连接池、认证模块 | 管理客户端TCP连接,账号密码校验,权限验证,复用连接 |
| Server服务层 | SQL接口、解析器、优化器、执行器 | 接收SQL,语法词法解析,生成抽象语法树;优化器生成最优执行计划;执行器调用存储引擎接口执行SQL |
| 存储引擎层 | InnoDB/MyISAM等插件 | 负责数据的存储、读取、事务、锁,Server层不管理数据存储细节 |
| 文件系统层 | 磁盘文件 | 存放表空间、日志文件、配置文件,依赖操作系统IO |
重点:Server层是公共层,所有存储引擎共用;不同存储引擎的差异只在存储引擎层。
二、主流存储引擎对比
| 引擎 | 事务支持 | 锁机制 | 索引 | 崩溃安全 | 适用场景 |
|---|---|---|---|---|---|
| InnoDB | ✅支持ACID事务 | 行锁+表锁,支持MVCC | 聚簇索引 | ✅支持崩溃恢复 | 默认引擎,业务生产首选,读写业务、高并发 |
| MyISAM | ❌无事务 | 仅表锁 | 非聚簇索引 | ❌崩溃容易损坏表 | 只读静态数据,低并发场景,现在生产基本弃用 |
| Memory | ❌无事务 | 表锁 | 哈希索引 | ❌内存数据,重启丢失 | 临时表,高速临时数据,不持久化 |
| Archive | ❌无事务 | 无锁 | 无索引 | ✅简单持久化 | 海量归档写入,只插入极少查询 |
生产环境统一选择 InnoDB,MySQL5.5之后默认引擎。
三、InnoDB核心组件
InnoDB是MySQL生产唯一推荐引擎,核心模块如下:
| 组件 | 作用 |
|---|---|
| Buffer Pool(缓冲池) | 核心内存区域,缓存页(数据页、索引页),减少磁盘IO,InnoDB最重要内存模块 |
| Redo Log(重做日志) | 崩溃恢复核心,WAL机制,先写日志再刷盘,保证宕机数据不丢失 |
| Undo Log(回滚日志) | 事务回滚、MVCC多版本快照,保存数据修改前版本 |
| Lock 锁系统 | 行锁、意向锁、表锁,控制并发事务访问数据,解决并发冲突 |
| MVCC多版本并发控制 | 无锁读,实现事务隔离级别,读不加锁,提升并发性能 |
| DoubleWrite 双写缓冲区 | 防止页损坏,保证数据页写入磁盘安全 |
WAL(Write-Ahead Logging)预写日志机制
核心规则:修改数据页,先写Redo Log,再异步刷Buffer Pool脏页到磁盘。
好处:
- 随机IO转顺序IO,Redo Log是顺序写入,性能远高于随机刷数据页
- 崩溃恢复:宕机后,通过Redo Log重做未刷盘的修改,保证数据一致性
四、事务与ACID、隔离级别
ACID
- A 原子性:事务要么全部成功,要么全部失败,由Undo Log实现
- C 一致性:事务执行前后,数据完整性保持一致
- I 隔离性:多个并发事务之间互相隔离,由锁+MVCC实现
- D 持久性:事务提交,修改永久保存,宕机不丢失,由Redo Log实现
事务四大隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | InnoDB实现方式 |
|---|---|---|---|---|
| 读未提交 READ UNCOMMITTED | ✅存在 | ✅存在 | ✅存在 | 几乎不用 |
| 读已提交 READ COMMITTED(RC) | ❌无 | ✅存在 | ✅存在 | MVCC,每次读生成新快照 |
| 可重复读 REPEATABLE READ(RR,MySQL默认) | ❌无 | ❌无 | ✅存在(InnoDB通过间隙锁解决) | MVCC,事务开启生成快照+间隙锁 |
| 串行化 SERIALIZABLE | ❌无 | ❌无 | ❌无 | 所有读加共享行锁,并发极差 |
名词解释
脏读:读到其他事务未提交的数据
不可重复读:同一事务内,两次读取同一行,中间被其他事务修改提交,两次结果不一样
幻读:同一事务范围查询,其他事务插入新行,导致前后行数不一致
五、MVCC多版本并发控制原理
MVCC就是保存数据多个版本,实现快照读不加锁,提升并发。
- 快照读:普通select,读取历史版本,不加行锁
- 当前读:select ... for update / update / delete,读取最新版本,加行锁
每行隐藏字段:
- DB_TRX_ID:最后修改该行的事务ID
- DB_ROLL_PTR:回滚指针,指向Undo Log里旧版本数据
- DB_ROW_ID:没有主键时自动生成的隐藏主键
事务通过Read View判断版本可见性,RR隔离级别在事务第一次快照读时生成Read View;RC每次快照读都会新建Read View。
第一篇小结
本篇我们学习MySQL分层架构、存储引擎选型,重点理解InnoDB缓冲池、Redo/Undo日志、WAL、事务ACID、四大隔离级别和MVCC。
这是MySQL底层基础,索引、锁、主从、慢SQL都建立在这套基础之上。第二篇,我们讲解B+树索引、索引设计原则、explain执行计划、慢SQL定位与SQL优化实战。