【入门篇】2.7 MySQL基础架构(一) InnoDB 基本概念:页、区、段、

MySQL基础架构(一) InnoDB 基本概念
目录
1 记录
2 数据页
3 区和段
4 表空间
1 记录
每一条记录是表中的一行数据,这些数据则是根据表的各个字段(或称为列)来组织的。
记录是按照主键(primary key)的顺序存放的。记录的存放结构如下:

2 数据页
数据页,有时也被称为页或块,是数据库文件系统的基本单位。它是一种存储结构,数据库系统通常将数据按页的形式读写。每个页有固定的大小,通常为4KB、8KB、16KB等,在很多数据库系统中,这个大小是可配置的。
在MySQL的InnoDB存储引擎中,数据页的大小默认是16KB,包含了一些特定的信息,如页头和页尾信息、用户记录和索引等。每个数据页都有一个页号,通过页号可以定位到数据页。
下面是一个InnoDB的数据页的大致组成:
- 文件头(File Header):针对所有页,包含一些页的元信息,例如当前页号、下一个页的页号、上一个页的页号、页面类型等。
- 页头(Page Header):专门针对存放数据的页,包含数据页的一些元信息,例如页内记录数量、修改当前页最大的事务ID、当前页在B+树的哪个层级等。
- 用户记录(User Records):存放了记录的真实数据以及记录的额外信息,记录按主键顺序存储。
- 页目录(Page Directory):存放了对用户记录的一些快速定位信息,可以提高搜索效率。
- Free Space:未使用的空间。
- 页尾(Page Trailer):存储页的校验和,用于数据完整性校验。
数据页结构简单图示:

3 区和段
在MySQL的InnoDB存储引擎中,"区(Segment)" 是一个重要的存储单位,通常包含多个连续的数据页。其主要用于处理磁盘空间的分配和回收。段是一个逻辑的概念,是零散页面或者完整区的集合。
区的结构图如下所示:

以下是一些关于InnoDB中"区"的基本信息:
- 一个区的大小通常为1MB,由连续的64个数据页组成,每个数据页默认大小为16KB。当然,这些数值也可能因为InnoDB配置的不同而有所改变。每256个区划分为一组,一组内的区有统一的元数据信息,统一管理。
- 区主要用于磁盘空间的分配和管理。当InnoDB需要存储数据时,会申请一个或多个区。当一个区的空间用尽时,InnoDB会申请一个新的区。同样地,当一个区中的所有页都不再被需要时,InnoDB会释放整个区,将其归还给操作系统。
- 区的类型:
- 空闲的区:现在还没有用到这个区中的任何页面。
- 有剩余空间的碎片区:表示碎片区中还有可用的页面。
- 没有剩余空间的碎片区:表示碎片区的所有页面都被使用,没有空闲页面。
- 附属于某个段的区:这些区会被组织成以下链表:
- FREE 链表
- NOT FULL 链表
- FULL 链表
4.InnoDB会在后台进行空闲区的回收,当空闲区达到一定数量时,会选择一部分回收,归还给操作系统。
段的结构图如下所示:

可以看到,段和区的概念是紧密相连的。
4 表空间
表空间是一种物理存储单元,用于存储和组织数据库中的数据和索引。具体来说,表空间是一个或者多个磁盘文件,这些文件中包含了各种数据结构,例如表的行数据、索引数据、Undo日志、Insert Buffer等。表空间由许多连续或非连续的区(Extent)组成。每个区是连续的1MB磁盘空间,由64个连续的数据页(Page)组成,每个数据页的大小默认为16KB。
表空间分类:
- 系统表空间:在InnoDB中,系统表空间是默认的、最重要的表空间,通常保存在名为"ibdata1"的文件中。系统表空间包含了InnoDB存储引擎的各种关键数据结构,例如数据字典、双写缓冲区、Undo日志、Insert Buffer等。此外,如果没有启用独立表空间,那么所有用户表的数据和索引也会存储在系统表空间中。
- 独立表空间:InnoDB支持为每一个表或分区创建独立的表空间,这通常被称为独立表空间。每个独立表空间都保存在一个单独的.ibd文件中。独立表空间可以使表的管理更加灵活,例如可以将重要的表放在高性能的磁盘上,而将不太重要的表放在低性能的磁盘上。
- 临时表空间:InnoDB会创建一个特殊的表空间用于存储临时表和临时排序数据,这就是临时表空间。临时表空间通常保存在"ibtmp1"文件中。
- Undo表空间:较新的版本可以自定义Undo表空间,用于存储Undo日志。在旧版本的InnoDB中,Undo日志是存储在系统表空间中的。
系统表空间在磁盘中的存放位置:

独立表空间在磁盘中的存放位置:
