目录
随着数据库技术的不断发展,了解不同存储引擎的限制变得至关重要。本文将深入探讨InnoDB存储引擎的一系列限制,包括表、索引、表空间等方面的限制,帮助开发人员更好地理解和优化数据库设计。
MySQL规定,一个表最多可以包含1017个列。需要注意的是,虚拟生成列也计入这一限制。对于那些需要大量列的业务场景,开发人员应当注意这一限制,确保表结构的设计在合理范围内。
每个表最多可以包含64个辅助索引(secondary indexes)。辅助索引在数据库查询优化中起着重要作用,但限制了其数量有助于维持系统的高效性。
InnoDB支持不同的行格式,包括DYNAMIC、COMPRESSED、REDUNDANT和COMPACT。这些行格式在索引键前缀长度方面有所不同。
对于使用DYNAMIC或COMPRESSED行格式的表,索引键前缀长度限制为3072字节。这为数据库设计提供了更大的灵活性,但也需要开发人员注意索引键长度的合理控制,以避免超出限制。
对于使用REDUNDANT或COMPACT行格式的表,索引键前缀长度限制为767字节。在这种情况下,开发人员需要更谨慎地选择索引和列前缀长度,以确保不会超出限制。
举例来说,如果在utf8mb4字符集下,使用了TEXT或VARCHAR列,并且尝试创建一个超过191字符的列前缀索引,就有可能超出限制,导致错误的发生。
InnoDB的页大小也会影响索引键前缀长度的限制。通过在创建MySQL实例时指定innodb_page_size
选项,可以将InnoDB页大小设置为8KB或4KB。在这种情况下,最大索引键长度将按比例降低,基于16KB页大小的3072字节限制。
值得注意的是,适用于索引键前缀的限制也同样适用于全列索引键。在设计数据库表时,开发人员应当综合考虑这些限制,以制定出最佳的数据库索引策略。
对于多列索引,InnoDB表规定最多允许16个列。超出这个限制将导致错误的发生,系统会返回类似以下的错误信息:
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
InnoDB表对行的大小也有一定的限制。虽然InnoDB内部支持大于65,535字节的行大小,但MySQL本身对行的大小设置了一个限制,不允许超过65,535字节。这一限制是对所有列大小的综合限制,开发人员应当在设计表结构时留意这个限制。
对于InnoDB日志文件,其组合最大大小限制为512GB。
InnoDB表的表空间大小也是有限制的,最小表空间大小略大于10MB。具体的最大表空间大小取决于InnoDB页大小,具体关系如下表所示:
InnoDB Page Size | 最大表空间 |
---|---|
4KB | 16TB |
8KB | 32TB |
16KB | 64TB |
32KB | 128TB |
64KB | 256TB |
一个InnoDB实例支持最多2^32(4294967296)个表空间,其中一小部分表空间被保留用于撤销和临时表。
共享表空间支持最多2^32(4294967296)个表。
在一些老旧的操作系统上,文件大小可能受到2GB的限制,但这并不是InnoDB的限制。如果需要更大的系统表空间,建议使用多个较小的数据文件,而不是一个大型数据文件,或者将表数据分布在以文件为单位的表空间数据文件中。
表空间文件的路径,包括文件名,不能超过Windows上的MAX_PATH限制。在Windows 10之前,MAX_PATH
限制为260个字符。截至Windows 10,版本1607,常见的Win32文件和目录函数不再受MAX_PATH
限制,但您必须启用新的行为。
有关并发读写事务的限制,待续。