在配置文件中使用 innodb_data_file_path
配置选项定义的数据文件形成 InnoDB
的 系统表空间。这些文件逻辑上连接以形成系统表空间。没有使用条带化。您不能定义表在系统表空间中的分配位置。在新创建的系统表空间中,InnoDB
从第一个数据文件开始分配空间。
为了避免将所有表和索引存储在系统表空间中的问题,您可以启用 innodb_file_per_table
配置选项(默认),该选项将每个新创建的表存储在单独的表空间文件中(带有扩展名 .ibd
)。对于以这种方式存储的表,磁盘文件中的碎片较少,当表被截断时,空间将被返回给操作系统,而不是仍然被 InnoDB
在系统表空间中保留。有关更多信息,请参阅 第 17.6.3.2 节,“每表表空间”。
您还可以将表存储在 通用表空间 中。通用表空间是使用 CREATE TABLESPACE
语法创建的共享表空间。它们可以在 MySQL 数据目录外创建,能够容纳多个表,并支持所有行格式的表。有关更多信息,请参阅 第 17.6.3.3 节,“通用表空间”。
每个表空间由数据库 页面 组成。每个 MySQL 实例中的所有表空间都具有相同的 页面大小。默认情况下,所有表空间的页面大小为 16KB;您可以通过指定 innodb_page_size
选项在创建 MySQL 实例时将页面大小减少到 8KB 或 4KB。您也可以将页面大小增加到 32KB 或 64KB。有关更多信息,请参阅 innodb_page_size
文档。
这些页面被分组成 区段,每个区段的大小为 1MB(对于 16KB 的页面大小,64 个连续的 16KB 页面,或者 128 个 8KB 页面,或者 256 个 4KB 页面)。对于 32KB 的页面大小,区段大小为 2MB。对于 64KB 的页面大小,区段大小为 4MB。表空间中的“文件”被称为 段 在 InnoDB
中。(这些段与 回滚段 不同,后者实际上包含许多表空间段。)
当段在表空间中增长时,InnoDB
首先将前 32 页分配给它,然后开始分配整个区段给段。InnoDB
可以将多达 4 个区段添加到大段中,以确保数据的良好顺序性。
对于 InnoDB
中的每个索引,分配两个段。一个用于 B 树 的非叶节点,另一个用于叶节点。将叶节点保持在磁盘上连续,以便进行良好的顺序 I/O 操作,因为这些叶节点包含实际的表数据。
表空间中的某些页面包含其他页面的位图,因此在 InnoDB
表空间中,某些区段不能作为整体分配给段,而只能作为单个页面分配。
当您通过发出 SHOW TABLE STATUS
语句请求表空间中的可用免费空间时,InnoDB
报告表空间中肯定免费的区段。InnoDB
总是保留一些区段用于清洁和其他内部目的;这些保留的区段不包括在免费空间中。
当您从表中删除数据时,InnoDB
会收缩相应的 B 树索引。释放的空间是否可供其他用户使用取决于删除模式是否释放表空间中的单个页面或范围。如果您删除表或删除表中的所有行,空间将被释放给其他用户,但请记住,已删除的行只有在不再需要用于事务回滚或一致读取时才会被物理删除,这是通过 purge 操作自动完成的。(见 第 17.3 节,“InnoDB 多版本控制”。)
变量 innodb_segment_reserve_factor
允许定义表空间文件段页面的保留百分比。一些页面被保留为空白页,以便 B 树中的页面可以连续分配。可以修改保留页面百分比,以微调 InnoDB
以解决数据碎片或存储空间使用不当的问题。
该设置适用于每个表文件和通用表空间。innodb_segment_reserve_factor
的默认设置为 12.5%。
变量 innodb_segment_reserve_factor
是动态的,可以使用 SET
语句进行配置。例如:
mysql> SET GLOBAL innodb_segment_reserve_factor=10;
对于 4KB、8KB、16KB 和 32KB 的 innodb_page_size
设置,最大行长度略小于数据库页面的一半。例如,对于默认的 16KB InnoDB
页面大小,最大行长度略小于 8KB。对于 64KB 的 innodb_page_size
设置,最大行长度略小于 16KB。
如果行不超过最大行长度,全行将被存储在页面中。如果行超过最大行长度,可变长度列 将被选择用于外部离页存储,直到行长度符合最大行长度限制。外部离页存储对于可变长度列的处理方式因行格式而异:
-
COMPACT 和 REDUNDANT 行格式
当可变长度列被选择用于外部离页存储时,
InnoDB
将前 768 字节存储在行中,并将其余部分存储在溢出页面中。每个这样的列都有其自己的溢出页面列表。768 字节的前缀伴随着一个 20 字节的值,该值存储了列的真实长度,并指向溢出列表中存储的剩余值。见 第 17.10 节,“InnoDB 行格式”。 -
DYNAMIC 和 COMPRESSED 行格式
当可变长度列被选择用于外部离页存储时,
InnoDB
将 20 字节的指针存储在行中,并将其余部分存储在溢出页面中。见 第 17.10 节,“InnoDB 行格式”。
LONGBLOB
和 LONGTEXT
列的长度不得超过 4GB,包括 BLOB
和 TEXT
列的总长度不得超过 4GB。