您在配置文件中使用 innodb_data_file_path
配置选项定义的数据文件构成了 InnoDB
系统表空间。这些文件在逻辑上连接起来形成系统表空间。未使用条带化。您无法定义表在系统表空间内的分配位置。在新创建的系统表空间中,InnoDB
从第一个数据文件开始分配空间。
为了避免将所有表和索引存储在系统表空间内带来的问题,您可以启用 innodb_file_per_table
配置选项(默认值),该选项将每个新创建的表存储在一个单独的表空间文件(扩展名为 .ibd
)中。对于以这种方式存储的表,磁盘文件内的碎片更少,并且当表被截断时,空间会返回给操作系统,而不是仍然由 InnoDB 在系统表空间内保留。有关更多信息,请参阅第 17.6.3.2 节,“每个表一个文件表空间”。
您还可以将表存储在通用表空间中。通用表空间是使用 CREATE TABLESPACE
语法创建的共享表空间。它们可以在 MySQL 数据目录之外创建,能够容纳多个表,并支持所有行格式的表。有关更多信息,请参阅第 17.6.3.3 节,“通用表空间”。
每个表空间由数据库页面组成。MySQL 实例中的每个表空间都具有相同的页面大小。默认情况下,所有表空间的页面大小均为 16 KB;您可以在创建 MySQL 实例时通过指定 innodb_page_size
选项来将页面大小减小为 8 KB 或 4 KB。您还可以将页面大小增加到 32 KB 或 64 KB。有关更多信息,请参阅 innodb_page_size
文档。
对于页面大小最大为 16 KB 的页面,页面被分组为大小为 1 MB 的区(64 个连续的 16 KB 页面,或 128 个 8 KB 页面,或 256 个 4 KB 页面)。对于 32 KB 的页面大小,区大小为 2 MB。对于 64 KB 的页面大小,区大小为 4 MB。“文件” 在表空间内被称为 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。