您使用innodb_data_file_path 配置选项在配置文件中定义的数据文件 形成InnoDB 系统表空间。这些文件在逻辑上串联在一起形成系统表空间。没有使用中的条带化。您无法定义表在系统表空间中的分配位置。在新创建的系统表空间中,InnoDB从第一个数据文件开始分配空间。
为避免将所有表和索引存储在系统表空间中所带来的问题,可以启用 innodb_file_per_table 配置选项(默认选项),该选项将每个新创建的表存储在单独的表空间文件中(扩展名为 .ibd)。对于以这种方式存储的表,磁盘文件中的碎片较少,当表被截断时,该空间将返回给操作系统,而不是仍由InnoDB在系统表空间中保留。
您还可以将表存储在 常规表空间中。常规表空间是使用CREATE TABLESPACE 语法创建的共享表空间。它们可以在MySQL数据目录之外创建,能够容纳多个表,并支持所有行格式的表。
页面,范围,段和表空间
每个表空间由数据库页面组成 。MySQL实例中的每个表空间都具有相同的页面大小。默认情况下,所有表空间的页面大小均为16KB;您可以innodb_page_size在创建MySQL实例时通过指定选项将页面大小减小到8KB或4KB 。您还可以将页面大小增加到32KB或64KB。有关更多信息,请参阅 innodb_page_size文档。
这些页面分为 大小为1MB的扩展区,用于最大16KB的页面(64个连续的16KB页面,128个8KB页面或256个4KB页面)。对于32KB的页面大小,扩展区大小为2MB。对于64KB的页面大小,扩展区大小为4MB。在 “ 文件 ”表空间内被称为 段在 InnoDB。(这些段与回滚段不同, 回滚段实际上包含许多表空间段。)
当段在表空间内增长时, InnoDB一次将前32页分配给它。之后,InnoDB开始将整个扩展区分配给该段。InnoDB 一次最多可以向一个大段中添加4个扩展区,以确保数据的良好顺序。
为中的每个索引分配了两个段 InnoDB。一个用于 B树的非叶节点,另一个用于叶节点。将叶节点保持在磁盘上连续可以实现更好的顺序I / O操作,因为这些叶节点包含实际的表数据。
表空间中的某些页面包含其他页面的位图,因此表空间中的某些扩展数据InnoDB块不能整体分配给段,而只能分配给各个页面。
当您通过发出一条SHOW TABLE STATUS语句在表空间中请求可用空间时,请 InnoDB报告表空间中绝对可用的扩展区。InnoDB始终保留一定程度的清理和其他内部用途;这些保留的范围不包括在可用空间中。
从表中删除数据时,将InnoDB 收缩相应的B树索引。释放的空间是否可供其他用户使用取决于删除模式是否将单个页面或扩展区释放到表空间中。删除表或删除表中的所有行可以保证将空间释放给其他用户,但请记住,删除的行仅通过清除操作才能物理删除, 清除操作会在不再需要事务回滚或一致读取后的一段时间自动发生。
页面如何与表格行相关
对于4KB,8KB,16KB和32KB innodb_page_size设置,最大行长度略小于数据库页面的一半 。例如,对于默认的16KB InnoDB页面大小,最大行长度略小于8KB 。对于64KB页面,最大行长度略小于16KB。
如果某行未超过最大行长,则所有行都将存储在本地页面内。如果某行超出最大行长,则选择可变长度列进行外部页外存储,直到该行适合最大行长限制。可变长度列的外部页外存储因行格式而异:
紧凑和冗余行格式
当将可变长度列选择用于外部页外存储时,InnoDB将前768个字节本地存储在该行中,其余部分从外部存储到溢出页中。每个此类列都有其自己的溢出页面列表。768字节的前缀附带一个20字节的值,该值存储列的真实长度,并指向溢出列表,该值的其余部分存储在溢出列表中。请参见 第15.10节“ InnoDB行格式”。
动态和压缩行格式
如果将可变长度列选择用于外部页外存储,InnoDB则在行中本地存储一个20字节的指针,其余部分在外部存储到溢出页中。请参见第15.10节“ InnoDB行格式”。
LONGBLOB和 LONGTEXT列必须小于4GB,并且总行长(包括 BLOB和 TEXT列)必须小于4GB。