【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,实现无锁快照读
相关推荐
anxiao_m1 小时前
2026制造业云桌面选型攻略,不同生产场景适配方案汇总
大数据·网络·数据库
许彰午2 小时前
# 数据库配拦截器,不用改BPMN
数据库
lv__pf2 小时前
redis【msb 2026金三银四redis上】
数据库·redis·缓存
布莱克6053 小时前
理解数据库聚簇索引:原理、优势与适用场景
数据库·mysql
Nturmoils4 小时前
只面对一张表:KingbaseES 超表如何简化海量时序数据管理
数据库
starrocks_stella4 小时前
StarRocks 如何查询 Paimon 半结构化数据?Variant、Shredding 与 SQL 实践
数据库
这个DBA有点耶5 小时前
MySQL迁移实战:从mysqldump到专业工具的完整选型指南
数据库·mysql·dba
小白说大模型5 小时前
LLM集成数据库的幻觉治理:当AI给出的SQL建议是错的
数据库·人工智能·sql·oracle·重构·开源