表空间由segment、extend、page组成,其中page是InnoDB磁盘管理的最小单位(默认大小为16K)。如下图:
Segment (段)
常见的segment有数据段、索引段、回滚段等, 数据段为B+树的叶子节点(Leaf node segment)、索引段为B+树的非叶子节点(Non-leaf node segment)。如下图:
Extend (区)
每个区大小固定为1MB,为保证区中page的连续性通常InnoDB会一次从磁盘中申请4-5个区。在默认page的大小为16KB的情况下,一个区则由64个连续的page。
InnoDB 1.2.x版本增加参数innodb_page_size参数指定page的大小,但区的大小不会改变。 当启用了innodb_file_per_table参数后创建的表大小默认是96KB,而不是立即是1MB,是由于每个段开始先使用32个页大小的fragment page(碎片页)来存放数据,对于一些小表可节省磁盘空间。
Page (页)
每个page默认大小为16K, InnoDB 1.2.x版本增加参数innodb_page_size参数指定page的大小,设置完成后表中所有page大小都固定,除非重新dump再imports数据,否则不能再修改page大小。page类型有:
(1) B-tree node - 数据页
(2) undo log page - undo页
(3) system page - 系统页
(4) transaction system page - 事务数据页
(5) insert buffer bitmap - 插入缓冲位图页
(6) insert buffer free list - 插入缓冲空闲列表页
(7) uncompressed BLOB page - 未压缩缓冲空闲列表页
(8) compressed BLOB page - 压缩的二进制大对象页
ROW (行)
Innodb 存储引擎表的数据是按行进行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放 16 KB / 2 - 200 行的记录,即 7992 行记录。行空间中存放实际的表数据。