Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.11.2 文件空间管理

使用innodb_data_file_path配置选项在配置文件中定义的数据文件组成了InnoDB系统表空间。这些文件逻辑地连接起来形成系统表空间。没有striping使用。你不能定义在系统表空间中分配表的位置。在一个新的创建的系统表空间中,InnoDB从第一个数据文件开始分配空间。

为了避免将所有表和索引存储在系统表空间中带来的问题,可以启用innodb_file_per_table配置选项(默认),它将新创建的表存储在单独的表空间文件中(扩展名为.ibd)。对于使用这种方式存储的表,磁盘文件中的碎片化减少,当表被截断时,空间将返回到操作系统,而不是InnoDB在系统表空间中保留。更多信息,请见第17.6.3.2节,“File-Per-Table Tablespaces”

您也可以将表存储在一般表空间中。一般表空间是使用CREATE TABLESPACE语法创建的共享表空间。它们可以在MySQL数据目录外部创建,能够存储多个表,并支持所有行格式表。更多信息,请见第17.6.3.3节,“一般表空间”

Pages, Extents, Segments, and 表paces

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

页面被分组到大小为1MB的extent中,直到页面大小为16KB(64个连续的16KB页面、128个8KB页面或256个4KB页面)。对于32KB页面,extent大小为2MB;对于64KB页面,extent大小为4MB。一个表空间中的文件被称为segment,在InnoDB中(这些段落不同于回滚段,后者实际包含许多表空间段落)。

当一个段落在表空间中增长时,InnoDB将首先分配32个页面给它,然后开始分配整个extent到段落中。InnoDB可以同时添加最多4个extent到一个大型段落,以确保数据的顺序读写。

InnoDB中,每个索引都被分配两个段落。一个是非叶子节点的B-树,另一个是叶子节点。保持叶子节点在磁盘上的连续性,可以提高顺序I/O操作,因为这些叶子节点包含实际表数据。

一些表空间页面包含其他页面的位图,因此在InnoDB表空间中有一些extent不能被分配到段落中,而只能作为单个页面分配。

当您使用SHOW TABLE STATUS语句请求表空间中的可用空闲空间时,InnoDB报告的是表空间中确实为空闲的extent。InnoDB总是保留一些extent用于清理和其他内部目的,这些保留的extent不包括在免费空间中。

当您从表中删除数据时,InnoDB会收缩相应的B-树索引。是否可以将释放的空间用于其他用户取决于删除操作是否释放了单个页面或extent到表空间。如果是删除整个表或删除所有行,则可以确保释放空间,但请记住,已经删除的行直到它们不再需要用于事务回滚或一致读取时才会被物理删除。 (见第17.3节,“InnoDB Multi-Versioning”。)

变量innodb_segment_reserve_factor允许定义表空间文件段页面的百分比保留为空闲页面。为将来增长预留一些页面,以便B-树索引可以连续分配页面。能够修改保留页面百分比的能力使得InnoDB可以fine-tuning以解决数据碎片或存储空间不 efficient的问题。

该设置适用于文件表空间和通用表空间。默认的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设置,最大行长约为数据库页面大小的一半。例如,对于默认的16KBInnoDB页面大小,最大行长约为8KB。对于64KB的innodb_page_size设置,最大行长约为16KB。

如果一行不超过最大行长限制,则其所有部分都将在页面中本地存储。如果一行超过最大行长限制,则可变长度列将被选择用于外部离页存储,直到行适应于最大行长限制。可变长度列在不同行格式下进行外部离页存储:

  • COMPACT和REDUNDANT行格式

    当选择变长列进行外部离页存储时,InnoDB 将首先768个字节存储在行中,并将其余部分存储在溢出页面中。每个这样的列都有自己的溢出页面列表。768个字节的前缀伴随着20个字节的值,该值存储列的真实长度,并指向溢出列表,其中存储了该值的其余部分。请参见第17.10节,“InnoDB Row Formats”

  • DYNAMIC and COMPRESSED Row Formats

    当选择变长列进行外部离页存储时,InnoDB 将20个字节的指针存储在行中,并将其余部分存储在溢出页面中。请参见第17.10节,“InnoDB Row Formats”

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