您在配置文件中使用 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;您可以在创建 MySQL 实例时指定 innodb_page_size
选项,将页大小减小为 8KB 或 4KB。您还可以将页大小增加到 32KB 或 64KB。有关更多信息,请参阅 innodb_page_size
文档。
页面被分组为大小为 1MB 的 区,适用于大小最大为 16KB 的页面(64 个连续的 16KB 页面,或 128 个 8KB 页面,或 256 个 4KB 页面)。对于 32KB 的页大小,区大小为 2MB。对于 64KB 的页大小,区大小为 4MB。InnoDB
中的表空间内的“文件”称为 段。(这些段不同于 回滚段,后者实际上包含许多表空间段。)
当表空间内的段增长时,InnoDB
会一次分配前 32 个页面。之后,InnoDB
开始将整个区分配给该段。InnoDB
一次最多可以向大型段添加 4 个区,以确保数据的良好顺序性。
InnoDB
中为每个索引分配两个段。一个用于 B 树 的非叶节点,另一个用于叶节点。保持叶节点在磁盘上连续可以实现更好的顺序 I/O 操作,因为这些叶节点包含实际的表数据。
表空间中的某些页面包含其他页面的位图,因此 InnoDB
表空间中的某些区不能作为整体分配给段,而只能作为单个页面分配。
当您通过发出 SHOW TABLE STATUS
语句来查询表空间中的可用空间时,InnoDB
会报告表空间中确定可用的区。 InnoDB
始终会保留一些区用于清理和其他内部目的;这些保留的区不包括在可用空间中。
当您从表中删除数据时,InnoDB
会收缩相应的 B 树索引。释放的空间是否可供其他用户使用,取决于删除模式是将单个页面还是将区释放到表空间。删除表或删除表中的所有行保证将空间释放给其他用户,但请记住,删除的行只有在 清除 操作后才会被物理删除,清除操作在不再需要删除的行进行事务回滚或一致性读取后的一段时间内自动发生。(请参阅 第 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。