【MySQL17】进阶篇 | InnoDB引擎

一、InnoDB 逻辑存储结构(层级:大→小)

表空间 → 段 → 区 → 页 → 行

1. 表空间

对应磁盘 .ibd 文件,是 InnoDB 最高存储单元。一个 MySQL 可存在多个表空间,存储表数据、索引、回滚数据等。

2. 段

表空间内的逻辑单元,分为三种:

  • 数据段:存储业务数据
  • 索引段:存储索引数据
  • 回滚段:存储 undo log 回滚日志

3. 区

表空间的基础连续单元

  • 大小:1MB
  • 包含:64 个连续数据页
  • 机制:每次批量申请 4-5 个区,保证数据连续性、优化 IO

4. 页

InnoDB 磁盘最小管理单元

  • 默认大小:16KB
  • 所有读写均以页为单位

5. 行

InnoDB 最小数据存储粒度,数据按行存放。


二、InnoDB 整体架构

分为:内存结构、磁盘结构、后台线程

(一)内存结构

1. Buffer Pool 缓冲池
  • 核心缓存组件,缓存热点数据页
  • 增删改查优先操作内存,异步刷磁盘,大幅减少磁盘 IO
  • 以 Page 为单位、链表结构管理
2. Change Buffer 更改缓冲区
  • 只针对二级索引DML 操作
  • 数据页不在缓冲池时,变更先暂存此处,后续访问再合并刷盘
  • 解决二级索引随机 IO 问题,提升性能
3. 自适应哈希索引(AHI)
  • InnoDB 自动监控索引查询,可自主建立哈希索引
  • 优化热点页等值查询,无需人工维护
4. Log Buffer 日志缓冲区
  • 缓存 redo 日志,默认 16MB
  • 三种刷盘策略:
    • 0:每秒刷盘(性能高、不安全)
    • 1:每次事务提交强制刷盘(最安全、慢)
    • 2:提交写内存、每秒刷盘(折中)

(二)磁盘结构

  1. 通用表空间:手动创建,可指定表使用
  2. 撤销表空间:实例初始化自动创建,存 undo 日志
  3. 临时表空间:存储临时表数据,会话结束自动清理
  4. 双写缓冲区:数据页落盘前先备份,解决页断裂、异常恢复
  5. Redo Log 重做日志:保障事务持久性,宕机重启可恢复数据

(三)后台线程

  1. Master Thread:主线程,刷脏页、合并缓存、回收 undo 页
  2. IO Thread:处理异步 IO 请求回调,提升并发 IO 性能
  3. Purge Thread:回收已提交事务的 undo 日志
  4. Page Cleaner Thread:协助刷脏页,减轻主线程压力

三、事务原理 & ACID

1. 事务四大特性 ACID

  • 原子性:要么全成功、要么全回滚
  • 一致性:事务前后数据合法一致
  • 隔离性:并发事务互相隔离
  • 持久性:提交后数据永久生效

2. 底层实现分工

  • 原子性 ➜ undo log
  • 持久性 ➜ redo log
  • 一致性 ➜ redo log + undo log
  • 隔离性 ➜ 锁 + MVCC

3. 核心日志

redo log(重做日志)
  • 记录数据页物理修改
  • 遵循 WAL 预写日志:先写日志、后写数据
  • 作用:崩溃恢复、保证持久性
undo log(回滚日志)
  • 记录数据修改前的快照
  • 作用:事务回滚、提供 MVCC 历史版本
  • 特点:insert undo 可立即删除;update/delete undo 需要保留用于快照读

四、MVCC 多版本并发控制

1. 核心作用

实现无锁快照读,解决读写冲突,提升并发,用于 RC、RR 隔离级别

2. 两种读

  • 当前读:读最新数据、加锁、阻塞(update/delete/select ... for update)
  • 快照读:普通 select、不加锁、非阻塞、读历史版本

3. MVCC 三大核心组件

隐藏字段 + undo 版本链 + ReadView

(1)行隐藏字段
  • DB_TRX_ID:最后修改该行的事务 ID
  • DB_ROLL_PTR:回滚指针,指向旧版本数据
  • DB_ROW_ID:无主键时的隐藏主键
(2)undo log 版本链

多次修改同一行,会通过回滚指针串联形成数据版本链表,保存所有历史快照版本。

(3)ReadView 读视图

快照读的判断依据,存储当前活跃事务信息,核心 4 字段:

  • m_ids:当前活跃事务 ID 集合
  • min_trx_id:最小活跃事务 ID
  • max_trx_id:最大活跃事务 ID+1
  • creator_trx_id:当前读视图所属事务 ID

4. 隔离级别差异

  • RC 读已提交 :每次快照读都会重新生成 ReadView,可读到已提交数据
  • RR 可重复读 :事务第一次快照读生成 ReadView,后续复用,保证可重复读

5. 可见性规则

通过版本链中每条记录的 trx_id 与 ReadView 比对,判断版本是否可见,最终实现多版本并发控制。


核心总结

  1. 存储层级:表空间→段→区→页→行
  2. 架构:内存(缓冲池、更改缓冲、日志缓冲等)+ 磁盘文件 + 后台线程
  3. 事务:undo 保证原子性、redo 保证持久性、锁 + MVCC 保证隔离性
  4. MVCC 依赖:隐藏字段 + 版本链 + ReadView,实现无锁快照读
相关推荐
初願致夕霞10 分钟前
MySQL_索引
数据库·mysql
十六年开源服务商38 分钟前
2026网站备份方案完整指南
数据库·oracle
一只小李郁vickie1 小时前
mysql 开启压缩传输3402条数据2.1秒压缩到毫秒级
数据库·mysql
张继雁2 小时前
张继雁 个人技术简介|磨削加工过滤方向
大数据·数据库·论文阅读·人工智能·机器学习·创业创新·业界资讯
IvorySQL2 小时前
PostgreSQL 日报|不重启动态修改 shared_buffers(9 月 8 日)
数据库·postgresql
这个DBA有点耶2 小时前
2026年做数据库开发,国产数据库已经是绕不开的选项了
数据库·dba·敏捷开发
前端兰博2 小时前
04-数据库-MySQL
后端·mysql
这个DBA有点耶2 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
老周聊架构3 小时前
Ontology:Palantir 架构真正的核心,不是数据库也不是知识图谱
数据库·架构·知识图谱
天衍四九-3 小时前
第一章:从 LLM 到 Agent —— DeepSeek Harness 入门
网络·数据库·人工智能·python