总体概述
下面是InnoDB逻辑存储结构的逻辑结构图:
可以看到,从大到小依次为:表空间(Tablespace)、段(segment)、区(extent)、页(page)、行(row)。
详细介绍
表空间
表空间可以看做InnoDB逻辑结构的最高层,所有的数据都放在表空间中。在默认情况下,InnoDB存储引擎都有一个共享表空间ibdata1,即所有数据都存放在这个表空间内。如果用户启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。如果启用了innodb_file_per_table参数,也需要注意,每张表的表空间存放的只是数据、索引和插入缓冲Bitmap页,其它类的数据,如回滚(undo)信息,插入缓冲索引页、系统事务信息,二次写缓冲等还是存放在原来的共享表空间内。
段
表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等,段是一个逻辑的概念。一个 ibd 文件(独立表空间文件)里面会由很多个段组成。创建一个索引会创建两个段,一个是索引段:leaf node segment,一个是数据段:non-leaf node segment。索引段管理非叶子节点的数据,数据段管理叶子节点的数据。
注意: 从上面可知,一个表的段数,就是索引的个数乘以 2
区
一个段由很多区组成,而一个区是由连续页组成的空间,在任何情况下每个区的大小都是1MB(即64个连续的页)。每一个段至少会有一个区,一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是区。
特别注意: 在创建表时,默认大小是96KB,这明显小于一个区的大小,这种反常现象的原因就是:在创建一些小表或者undo段时,为了减少磁盘容量开销,在每个段开始时,先用32个页大小的碎片页来存储数据,在这些使用完后才是申请64个连续的页。
页
页是 InnoDB 存储引擎磁盘管理的最小单位,默认每个页的大小为16KB,可以通过指定参数innodb_page_size 设置页的大小,不过只能设置4KB、8KB、16KB。一个表空间最多拥有 2^32 个页,默认情况下一个页的大小为 16KB,也就是说一个表空间最多存储 64TB 的数据。一个B+树节点就是一个页(16KB),页的编号可以映射到物理文件偏移,如下图:
注意: 操作系统中,最小的单位是页 Page,文件系统的内存页通常是 4K。

InnoDB存储引擎中,常见的页类型有:
- 数据页(B-tree Node)
- undo页(undo Log Page)
- 系统页 (System Page)
- 事务数据页 (Transaction System Page)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 插入缓冲空闲列表页(Insert Buffer Free List)
- 未压缩的二进制大对象页(Uncompressed BLOB Page)
- 压缩的二进制大对象页 (compressed BLOB Page)
行
InnoDB存储引擎是面向行的(row-oriented),也就是说数据是按行进行存放的,每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200,即7992行记录。
