网站Logo Ilren 小记

InnoDB 是如何存储数据的?一文读懂 MySQL 的核心引擎设计

jack
7
2023-02-16

InnoDB 是如何存储数据的?

深入解析 MySQL 最流行的存储引擎

MySQL 默认存储引擎 InnoDB,凭借强大的事务支持、行级锁和崩溃恢复机制成为主流选择。理解它的存储结构能帮助我们更好地优化数据库性能。

1. InnoDB 存储架构层次介绍

InnoDB 的数据存储是多层次的,从磁盘文件到具体的行,层层递进。

它由表空间、段、区、页、行组成,形成了高效且灵活的存储管理体系。

层级

描述

说明

表空间

InnoDB 数据存储的最高层容器

包含系统表空间、独立表空间、通用表空间等

段(Segment)

表空间中的逻辑单位,如数据段、索引段等

管理页的集合,负责具体数据或索引存储

区(Extent)

64 个连续页组成,大小约 1MB

用于空间分配的基本单元

页(Page)

InnoDB 最小 I/O 单元,默认 16KB

存储数据记录和索引节点

行(Row)

真实存储的用户数据记录

数据库中实际的业务数据

2. 表空间类型及作用

表空间是物理文件,InnoDB 管理数据和索引的存放位置。理解表空间有助于数据库的备份和恢复设计。

表空间类型

作用

说明

系统表空间

存储数据字典、Undo日志、双写缓冲区等

默认共享空间,文件一般是 ibdata1

独立表空间

每个表有单独的 .ibd 文件

需开启 innodb_file_per_table,方便单表管理与恢复

通用表空间

多张表共享一个表空间

适合特殊场景,管理灵活但复杂

临时表空间

用于存放临时表和排序数据

系统自动管理,用户无需干预

3. 页结构解析

InnoDB 的数据存储以页为单位。每页 16KB,是数据读写的最小单位。

一个页由多个部分构成,分别管理不同类型的信息,以保证数据完整性与访问效率。

部分

字节大小

作用及说明

文件头

38 字节

页编号,前后页指针等元信息

页头

56 字节

页状态、槽位数量、空闲空间管理

Infimum/Supremum

26 字节

虚拟的最小和最大记录,用于定义页中数据的边界

用户记录

变长

存放实际的行数据

空闲空间

变长

剩余可用空间

页目录

变长

指向记录的指针集合,支持高效查找

文件尾

8 字节

校验和,用于检测数据完整性

4. 行格式与数据存储

InnoDB 支持多种行格式以平衡性能和存储需求,常用格式有 COMPACT、DYNAMIC 等。

每条行数据由记录头、事务信息及列数据组成,支持大字段溢出页存储。

行格式

特点及应用

COMPACT

紧凑存储,节省空间

REDUNDANT

兼容旧版本,较冗余

DYNAMIC

默认格式,大字段支持溢出存储

COMPRESSED

支持表和索引压缩,节省存储空间

行记录结构(以 DYNAMIC 为例):

组成

大小

说明

记录头

5 字节

包含删除标记、类型信息、链表指针

事务 ID

6 字节

支持多版本并发控制(MVCC)

回滚指针

7 字节

指向 Undo 日志,用于事务回滚与快照读

列数据

变长

实际存储的字段数据

5. 聚簇索引设计

InnoDB 的表数据本身存储在主键索引的 B+ 树叶子节点上,这种设计称为聚簇索引。

  • 主键查询高效,数据有序存储。

  • 二级索引存储主键值,查找时需回表。

  • 没有主键时自动生成隐藏主键。

特点

说明

数据存储

按主键排序存储在 B+ 树叶子节点

二级索引

叶子节点保存主键,非直接指向数据

查询效率

主键查询快,二级索引查询需两步

6. 事务与 MVCC

InnoDB 支持 ACID 事务,通过 Undo 日志、Redo 日志和 MVCC 保证数据一致性。

  • Undo 日志:支持事务回滚和快照读。

  • Redo 日志:保证崩溃恢复。

  • MVCC 通过事务ID和回滚指针实现高并发。

行记录包含事务相关字段:

字段名

作用

DB_TRX_ID

最后修改该行的事务 ID

DB_ROLL_PTR

指向 Undo 日志的回滚指针

DB_ROW_ID

隐藏主键(无显式主键时生成)

7. 缓冲池作用

InnoDB 利用缓冲池缓存页,减少磁盘 I/O,提升性能。

  • 缓冲池大小可调,推荐占用系统内存的50%-80%。

  • 使用 LRU 算法管理缓存,防止缓存污染。

  • 缓冲池是 InnoDB 性能的关键保障。

8. 总结

InnoDB 设计优势

作用与意义

聚簇索引

高效的主键访问和数据有序存储

B+ 树结构

平衡查询、插入与范围扫描性能

精细页结构设计

优化空间利用和 I/O 操作

事务支持与 MVCC

保证数据一致性与并发性能

大容量缓冲池

显著减少磁盘访问,提升响应速度

通过理解 InnoDB 存储机制,你可以更合理地设计索引、优化查询、配置数据库参数,提升整体系统性能。

动物装饰