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”。