MySQL 之 InnoDB 存储结构

发布时间:2023-10-30   浏览量:275

MySQL.jpg

InnoDB是MySQL中最常用的存储引擎之一,它的高可靠性、高并发性、多版本控制和事务等特性,使其适合于应用在数据密集型的在线事务处理(OLTP)场景。

而为了实现这些特性,InnoDB 在数据的组织和存储上有着非常独特的结构,本文将详细介绍 InnoDB 存储结构。

一、InnoDB 数据文件

InnoDB 的数据文件由共享表空间(ibdata1)和表空间文件(.ibd)两种类型组成。其中,共享表空间存放系统表和一些内部信息,而表空间文件则存储用户定义的表和数据。

InnoDB 使用自己的页式文件格式来管理数据,每个页的大小默认为16KB。整个数据文件由多个数据页组成,也就是说,每个表的数据都被存放在不同的数据页中。

二、InnoDB 行存储结构

1. B+ 树索引结构

在 InnoDB 中,行数据使用 B+ 树索引结构进行组织和存储。在一个 B+ 树上,每个节点都有一个指针数组,指向下一级节点或者对应的数据页。

这样就可以在不同层级之间快速地跳转,并且可以利用磁盘预读取机制提高查询效率。

2. 聚簇索引

InnoDB 的聚簇索引(Clustered Index)是其独特的存储结构之一。

聚簇索引的特点是将表数据和索引数据存放在同一个 B+ 树上,即按照主键的顺序将数据行进行排序,然后再将主键值和数据行的地址关联起来存储。

聚簇索引的好处是可以尽量减少磁盘 I/O 操作,当通过主键查询或者使用范围扫描时,可以快速地定位到对应的数据页,从而提高查询效率。

3. 辅助索引

除了聚簇索引外,InnoDB 还支持辅助索引(Secondary Index),也就是非主键索引。辅助索引与聚簇索引不同的是,它并不直接关联数据行,而是通过指向聚簇索引中的主键值来间接定位数据行。

因此,当使用辅助索引查询时,需要先查找辅助索引,然后再使用聚簇索引定位到数据行。

三、InnoDB 表空间

1. 系统表空间

共享表空间(System Tablespace)是 InnoDB 存储系统表和内部元数据的地方,它包含两个重要的组件:重做日志文件(Redo Log File)和系统表数据。

- 重做日志文件:InnoDB 的重做日志文件是一种高效的写入日志,用来记录事务提交前所做的修改操作,包括数据更新、插入和删除操作等。

在发生崩溃或者系统意外宕机时,可以使用重做日志文件来恢复数据库数据的一致性。

- 系统表数据:系统表主要包含 InnoDB 存储引擎的内部元数据,例如表结构信息、约束条件等。

2. 用户表空间

与共享表空间不同,用户表空间(Tablespace)是针对用户定义的表和数据进行管理的。每个用户表空间都对应一个物理文件,以.ibd 后缀结尾,并存放于数据库目录下的 data 目录中。

在用户表空间中,每个表都有一个对应的表空间文件,其中包含了表的数据、聚簇索引和非聚簇索引等信息。

四、InnoDB 事务管理

InnoDB 作为一款支持事务的存储引擎,具有 ACID 属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这里我们主要介绍 InnoDB 的事务管理结构。

1. 事务 ID

每个事务会被赋予一个唯一的事务 ID,用来标识该事务。事务 ID 是一个递增的整数,从 1 开始,当达到最大值时会重新从 1 开始。

2. 锁机制

InnoDB 使用两种类型的锁进行事务管理:行级锁和表级锁。其中,行级锁用于控制并发访问数据行的冲突问题,而表级锁主要用于支持备份、恢复和DDL操作等场景。

InnoDB 的行级锁支持共享锁和排它锁两种模式,其中共享锁用于读取操作,而排它锁则用于写入操作。

3. 事务日志

InnoDB 存储引擎通过事务日志(Transaction Log)来实现事务的持久化。事务日志包括重做日志(Redo Log)和回滚日志(Undo Log)两个部分。

- 重做日志:在每个事务提交之前,InnoDB 会将该事务所做的所有修改操作记录到重做日志文件中,以保证在发生故障后能够恢复到事务提交之前的状态。

- 回滚日志:回滚日志主要用于支持事务的回滚操作。当一个事务需要回滚时,InnoDB 会根据回滚日志中的记录来撤销该事务所做的修改操作。

四、总结

本文对 InnoDB 存储结构进行了详细介绍。从数据文件、行存储结构、表空间以及事务管理等几个方面来说明了 InnoDB 存储引擎的独特之处。

同时,也解释了 InnoDB 如何实现高可靠性、高并发性和事务特性等重要功能,为后续的使用和优化提供了指导。


数据中心低代码平台