Documentation Home

14.12.2 文件空间管理

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

为避免将所有表和索引存储在系统表空间中所带来的问题,您可以启用 innodb_file_per_table 配置选项(默认设置),它将每个新创建的表存储在单独的表空间文件中(扩展名为 .ibd)。对于以这种方式存储的表,磁盘文件中的碎片较少,当表被截断时,空间将返回给操作系统,而不是仍然由 InnoDB 在系统表空间中保留。

页、范围、段和表空间

每个表空间都由数据库 页面组成。MySQL 实例中的每个表空间都具有相同的页面大小。默认情况下,所有表空间的页大小都是 16KB;innodb_page_size您可以通过在创建 MySQL 实例时 指定选项将页面大小减小到 8KB 或 4KB 。

这些页面被分组为 大小为 1MB 的范围(64 个连续的 16KB 页面,或 128 个 8KB 页面,或 256 个 4KB 页面)。表空间内 的 文件在 . (这些段不同于回滚段,后者实际上包含许多表空间段。) InnoDB

当段在表空间内增长时, InnoDB一次将前 32 页分配给它。之后,InnoDB开始将整个范围分配给段。InnoDB 一次最多可以将 4 个 extent 添加到一个大段中,以确保数据的良好顺序性。

为 中的每个索引分配两个段 InnoDB。一个用于 B 树的非叶节点,另一个用于叶节点。使叶节点在磁盘上保持连续可以实现更好的顺序 I/O 操作,因为这些叶节点包含实际的表数据。

表空间中的某些页包含其他页的位图,因此InnoDB 表空间中的一些盘区不能作为一个整体分配给段,而只能作为单独的页分配。

当您通过发出SHOW TABLE STATUS 语句请求表空间中的可用空闲空间时,InnoDB报告表空间中绝对空闲的盘区。InnoDB 总是保留一些范围用于清理和其他内部目的;这些保留范围不包括在可用空间中。

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

要查看有关表空间的信息,请使用表空间监视器。请参阅第 14.17 节,“InnoDB 监视器”

页面如何与表格行相关

最大行长度略小于数据库页面的一半。例如,对于默认的 16KB 页大小,最大行长度略小于 8KB InnoDB,这是由 innodb_page_size配置选项定义的。

如果一行不超过半页限制,则所有行都本地存储在页面内。如果一行超过半页限制,则选择可变长度列用于外部页外存储,直到该行适合半页。可变长度列的外部页外存储因行格式而异:

  • COMPACT 和 REDUNDANT 行格式

    When a variable-length column is chosen for external off-page storage, InnoDBstores the first 768 bytes locally in the row, and the rest externally into overflow pages. 每个这样的列都有自己的溢出页列表。768 字节的前缀伴随着一个 20 字节的值,该值存储列的真实长度并指向存储其余值的溢出列表。请参阅第 14.11 节,“InnoDB 行格式”

  • 动态和压缩行格式

    When a variable-length column is chosen for external off-page storage, InnoDBstores a 20-byte pointer locally in the row, and the rest externally into overflow pages. 请参阅第 14.11 节,“InnoDB 行格式”

LONGBLOBLONGTEXT列必须小于 4GB,并且包括列在内的总行长度 BLOB必须 TEXT小于 4GB。