本节介绍了 InnoDB
表、索引、表空间以及 InnoDB
存储引擎其他方面的限制。
一张表最多包含 1017 列。虚拟生成列也包含在这个限制中。
一张表最多包含 64 个 辅助索引.
对于使用
DYNAMIC
或COMPRESSED
行格式的InnoDB
表,索引键前缀长度限制为 3072 字节。对于使用
REDUNDANT
或COMPACT
行格式的InnoDB
表,索引键前缀长度限制为 767 字节。例如,对于使用utf8mb4
字符集并在每个字符最大为 4 字节的情况下,在TEXT
或VARCHAR
列上具有超过 191 个字符的 列前缀 索引,可能会遇到此限制。尝试使用超过限制的索引键前缀长度将返回错误。
如果您通过在创建 MySQL 实例时指定
innodb_page_size
选项将InnoDB
页大小 降低至 8KB 或 4KB,则索引键的最大长度将按比例降低,基于 16KB 页大小的 3072 字节限制。也就是说,当页大小为 8KB 时,索引键的最大长度为 1536 字节;当页大小为 4KB 时,索引键的最大长度为 768 字节。适用于索引键前缀的限制也适用于全列索引键。
多列索引最多允许 16 列。超过限制将返回错误。
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
最大行大小(不包括任何存储在页外的可变长度列)略小于 4KB、8KB、16KB 和 32KB 页大小的一半。例如,默认
innodb_page_size
为 16KB 的最大行大小约为 8000 字节。但是,对于InnoDB
页大小为 64KB,最大行大小约为 16000 字节。LONGBLOB
和LONGTEXT
列必须小于 4GB,并且总行大小(包括BLOB
和TEXT
列)必须小于 4GB。如果一行小于半页长,则该行将全部存储在页内。如果它超过半页长,则会选择可变长度列进行外部页外存储,直到该行适合于半页内,如 第 17.11.2 节,“文件空间管理” 中所述。
尽管
InnoDB
在内部支持大于 65,535 字节的行大小,但 MySQL 本身对所有列的组合大小施加了 65,535 的行大小限制。请参阅 第 10.4.7 节,“表列数和行大小的限制”.最大表大小或表空间大小受服务器文件系统的影响,文件系统可能会施加小于
InnoDB
定义的内部 64 TiB 大小限制的最大文件大小。例如,Linux 上的 ext4 文件系统具有 16 TiB 的最大文件大小,因此最大表大小或表空间大小变为 16 TiB,而不是 64 TiB。另一个例子是 FAT32 文件系统,它具有 4 GB 的最大文件大小。如果需要更大的系统表空间,请使用多个较小的数据文件而不是一个大型数据文件来配置它,或者将表数据分布在每表文件和通用表空间数据文件之间。
InnoDB
日志文件的总最大大小为 512GB。最小表空间大小略大于 10MB。最大表空间大小取决于
InnoDB
页面大小。最大表空间大小也是单个表的最大大小。
一个
InnoDB
实例最多支持 2^32 (4294967296) 个表空间,其中一小部分表空间保留用于撤消和临时表。共享表空间最多支持 2^32 (4294967296) 个表。
表空间文件的路径(包括文件名)不能超过 Windows 上的
MAX_PATH
限制。在 Windows 10 之前,MAX_PATH
限制为 260 个字符。从 Windows 10 版本 1607 开始,MAX_PATH
限制已从常见的 Win32 文件和目录函数中移除,但您必须启用此新行为。有关与并发读写事务相关的限制,请参见 第 17.6.6 节,“撤消日志”.