本节描述存储引擎
的InnoDB
表、索引、表空间和其他方面的
限制。InnoDB
一个表最多可以包含 1017 列(在 MySQL 5.6.9 中提高了之前的 1000 列限制)。虚拟生成的列包含在此限制中。
一个表最多可以包含 64 个 二级索引。
如果
innodb_large_prefix
启用(默认),索引键前缀限制为 3072 字节,用于InnoDB
使用DYNAMIC
orCOMPRESSED
行格式的表。如果innodb_large_prefix
禁用,对于任何行格式的表,索引键前缀限制为 767 字节。innodb_large_prefix
已弃用;希望在未来的 MySQL 版本中将其删除。 在 MySQL 5.5 中引入以禁用大索引键前缀,以与不支持大索引键前缀innodb_large_prefix
的早期版本兼容 。InnoDB
对于使用or 行格式的
InnoDB
表, 索引键前缀长度限制为 767 字节 。例如,您可能会 在或 列上使用超过 255 个字符的列前缀索引达到此限制,假设有一个 字符集并且每个字符最多 3 个字节。REDUNDANT
COMPACT
TEXT
VARCHAR
utf8mb3
尝试使用超过限制的索引键前缀长度会返回错误。为避免复制配置中的此类错误,
innodb_large_prefix
如果不能在副本上启用,请避免在源上启用。如果您在创建 MySQL 实例时通过指定 选项将
InnoDB
页面大小减小innodb_page_size
到 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。如果一行的长度小于半页,则所有行都存储在页面的本地。如果它超过半页,则选择可变长度列用于外部页外存储,直到该行适合半页,如 第 14.12.2 节,“文件空间管理”中所述。
尽管
InnoDB
内部支持大于 65,535 字节的行大小,但 MySQL 本身对所有列的组合大小施加了 65,535 的行大小限制。请参阅 第 8.4.7 节,“表列数和行大小的限制”。在一些较旧的操作系统上,文件必须小于 2GB。这不是
InnoDB
限制。如果您需要一个大的系统表空间,请使用几个较小的数据文件而不是一个大的数据文件来配置它,或者将表数据分布在 file-per-table 和通用表空间数据文件中。InnoDB
日志文件 的最大组合大小为512GB。最小表空间大小略大于 10MB。最大表空间大小取决于
InnoDB
页面大小。最大表空间大小也是表的最大大小。
在 Windows 32 位系统上,表空间文件不能超过 4GB(缺陷号 80149)。
一个
InnoDB
实例最多支持 2^32 (4294967296) 个表空间,其中少量表空间保留用于撤消表和临时表。共享表空间最多支持 2^32 (4294967296) 个表。
表空间文件的路径,包括文件名,不能超过
MAX_PATH
Windows 的限制。在 Windows 10 之前,MAX_PATH
限制为 260 个字符。从 Windows 10 版本 1607 开始,MAX_PATH
常见 Win32 文件和目录功能的限制已被删除,但您必须启用新行为。ROW_FORMAT=COMPRESSED
在 Barracuda文件格式中假定页面大小最大为 16KB 并使用 14 位指针。有关与并发读写事务相关的限制,请参阅第 14.6.7 节,“撤消日志”。