(架构 + InnoDB 事务 MVCC):《MySQL 底层探秘①:拆解 InnoDB,读懂事务、MVCC 与日志的底层逻辑》

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脏页到磁盘。

好处:

  1. 随机IO转顺序IO,Redo Log是顺序写入,性能远高于随机刷数据页
  2. 崩溃恢复:宕机后,通过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,读取最新版本,加行锁

每行隐藏字段:

  1. DB_TRX_ID:最后修改该行的事务ID
  2. DB_ROLL_PTR:回滚指针,指向Undo Log里旧版本数据
  3. DB_ROW_ID:没有主键时自动生成的隐藏主键

事务通过Read View判断版本可见性,RR隔离级别在事务第一次快照读时生成Read View;RC每次快照读都会新建Read View。

第一篇小结

本篇我们学习MySQL分层架构、存储引擎选型,重点理解InnoDB缓冲池、Redo/Undo日志、WAL、事务ACID、四大隔离级别和MVCC。

这是MySQL底层基础,索引、锁、主从、慢SQL都建立在这套基础之上。第二篇,我们讲解B+树索引、索引设计原则、explain执行计划、慢SQL定位与SQL优化实战。

相关推荐
kyle~1 小时前
Linux --- 虚拟内存 1.fork、2.COW、3.mmap、4.page fault、5.TLB、6.页表
linux·运维·服务器
你看我名字1 小时前
LAMP 架构演练:从云主机准备到 Apache、PHP、MySQL 上线验证
运维·ci/cd·架构·kubernetes·jenkins
服务器硬件项目经理1 小时前
第3章GPU vs CPU:为什么AI训练要用GPU
服务器·人工智能·嵌入式硬件·gru·硬件工程·硬件
Techblog of HaoWANG1 小时前
Ubuntu 下将 Ollama 服务配置为监听 0.0.0.0:11434 完整实践
linux·数据库·ubuntu·ollama
似水流年QC1 小时前
LangChain 入门与实战
服务器·数据库·langchain
小HANN1 小时前
Ceph分布式存储深度解析-下篇
linux·运维·服务器·经验分享
张文君2 小时前
ubuntu iscsi客户端 关闭磁盘
linux·运维·ubuntu
凯基迪科技2 小时前
硬件做授权保护,有哪些常见方案
运维·服务器
优化Henry2 小时前
5G站点AAS-3设备故障排查与处理
运维·学习·5g·信息与通信