14.12.2 文件空间 Management

您使用innodb_data_file_path配置选项在配置文件中定义的数据文件形成InnoDB system tablespace。这些文件在逻辑上串联在一起以形成系统 table 空间。没有使用中的条带化。您无法定义 table 在系统 table 空间中的分配位置。在新创建的系统 table 空间中,InnoDB分配从第一个数据文件开始的空间。

为避免将所有 table 和索引存储在系统 table 空间内所带来的问题,可以启用innodb_file_per_table配置选项(默认选项),该选项将每个新创建的 table 存储在单独的 table 空间文件中(extensions 为.ibd)。对于以这种方式存储的 table,磁盘文件中的碎片较少,并且当 table 被截断时,该空间将返回给 os,而不是仍由 InnoDB 在系统 table 空间中保留。有关更多信息,请参见第 14.6.3.2 节“每 table 文件 table 空间”

您还可以将 table 存储在general tablespaces中。常规 table 空间是使用CREATE TABLESPACE语法创建的共享 table 空间。它们可以在 MySQL 数据目录之外创建,能够容纳多个 table,并支持所有行格式的 table。有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

页,范围,段和 table 空间

每个 table 空间由数据库pages组成。 MySQL 实例中的每个 table 空间都具有相同的page size。默认情况下,所有 table 空间的页面大小均为 16KB;您可以在创建 MySQL 实例时通过指定innodb_page_size选项将页面大小减小到 8KB 或 4KB。您还可以将页面大小增加到 32KB 或 64KB。有关更多信息,请参考innodb_page_size文档。

这些页面被分为大小为 1MB 的extents,用于最大 16KB 的页面(64 个连续的 16KB 页面,128 个 8KB 页面或 256 个 4KB 页面)。对于 32KB 的页面大小,扩展区大小为 2MB。对于 64KB 的页面大小,扩展区大小为 4MB。table 空间内的“文件”在InnoDB中称为segments。 (这些段不同于rollback segment,后者实际上包含许多 table 空间段。)

当段在 table 空间中增长时,InnoDB一次将前 32 页分配给它。之后,InnoDB开始将整个扩展区分配给该段。 InnoDB一次最多可以向一个大段添加 4 个扩展区,以确保良好的数据 Sequences。

InnoDB中的每个索引分配了两个段。一个用于B-tree的非叶节点,另一个用于叶节点。将叶子节点保持在磁盘上连续可以实现更好的 SequencesI/O 操作,因为这些叶子节点包含实际的 table 数据。

table 空间中的某些页面包含其他页面的位图,因此InnoDBtable 空间中的某些扩展区无法整体分配给段,而只能分配给单个页面。

当您通过发出显示 table 格状态语句在 table 空间中请求可用空间时,InnoDB报告 table 空间中绝对可用的扩展区。 InnoDB总是保留某些范围用于清理和其他内部目的;这些保留的范围不包括在可用空间中。

从 table 中删除数据时,InnoDB收缩相应的 B 树索引。释放的空间是否可供其他用户使用取决于删除模式是否将单个页面或扩展区释放到 table 空间中。删除 table 或删除 table 中的所有行可以保证将空间释放给其他用户,但请记住,删除的行仅通过purge操作才能物理删除,这种操作会在不再需要事务回滚或一致读取后的一段时间自动发生。 。 (请参阅第 14.3 节“ InnoDB 多版本”。)

页如何与 table 格行相关

对于 4KB,8KB,16KB 和 32KB innodb_page_size设置,最大行长度略小于数据库页面的一半。例如,对于默认的 16KB InnoDB页面大小,最大行长度略小于 8KB。对于 64KB 页面,最大行长度略小于 16KB。

如果某行未超过最大行长,则所有行都将存储在本地页面内。如果某行超出最大行长,则选择variable-length columns进行外部页外存储,直到该行适合最大行长限制。可变长度列的外部页外存储因行格式而异:

  • 紧凑和冗余行格式

如果将可变长度列选择用于外部页外存储,则InnoDB将行中的前 768 个字节存储在本地行中,其余的则在外部存储到溢出页中。每个此类列都有其自己的溢出页面列 table。 768 字节的前缀附带一个 20 字节的值,该值存储列的真实长度,并指向溢出列 table,该值的其余部分存储在溢出列 table 中。参见第 14.11 节“ InnoDB 行格式”

  • 动态和压缩行格式

当将可变长度列选择用于外部页外存储时,InnoDB在行中本地存储一个 20 字节的指针,其余部分在外部存储到溢出页中。参见第 14.11 节“ InnoDB 行格式”

LONGBLOBLONGTEXT列必须小于 4GB,包括BLOBTEXT列在内的总行长度必须小于 4GB。