本章讲述InnoDB表,索引,表空间,以及其它一些方面的限制。
一张表最多可以有1017列。这其中包含虚拟列。
一张表最多可以有64个二级索引。
对于行记录格式是DYNAMIC或COMPRESSED的InnoDB表,索引键签注及长度限制是3072字节。
对于行记录格式是REDUNDANT或COMPACT的InnoDB表,索引键签注及长度限制是767字节。例如,假设你用的字符集是utf8mb4,每个字符最多占用4个字节,那么对于text或varchar类型的列来说,长度超过191时,就会达到这个限制。
尝试使用键前缀长度超过限制的索引会返回一个错误。
如果你在创建MySQL实例时使用innodb_page_size将InnoDB页的大小降低到8KB或4KB,索引键的长度也会被相应降低。如果页大小是8KB,那索引键足底啊长度是1536字节。如果页大小是4KB,那索引键的长度限制是768字节。
索引键长度限制也适用于全列索引键。
一个索引最多可以有16个列。超过这个限制会返回一个错误。
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
除了存储在其它页的的变长列,每条记录的大小上限比每页的1/2略小一些。例如,对于innodb_page_size=16KB的表,每条记录的大小上限是约8000字节。然而,对于一个 页大小是64KB的页,每条记录的大小上限是16000字节。LONGBLOB和LONGTEXT列的大小必须小于4GB,而且包括BLOB和TEXT的记录总大小,必须比4GB小。
如果一条记录比1/2页小,那这条记录所有数据都会被存储这个这个页内。如果超过了1/2,变长字段就会被存储在其它页,直到这条记录剩余大小能小于1/2页。详见15.11.2,“文件空间管理”。
虽然InnoDB支持笔65535字节大的行记录。但是MySQL自身的行记录大小限制是65535字节。见章节8.4.2,“表中列的数量限制和行记录大小限制”。
在一些旧的操作系统上,单个文件文件必须小于2GB。InnoDB没有这个限制。如果你需要一个大的系统表空间。你可以设置成使用多个小的数据文件,而不是一个大的数据文件,或将表数据分布在每个表的文件和一般表空间数据文件中。
InnoDB日志文件总大小限制是512GB。
表空间的最小大小是比10MB略大。最大限制取决于InnoDB页大小。 表15.3.1 InnoDB Maximum Tablespace Size
InnoDB Page Size Maximum Tablespace Size 4KB 16TB 8KB 32TB 16KB 64TB 32KB 128TB 64KB 256TB 表空间大小最大值同时也是表的最大值。 一个InnoDB实例支持最多2^32(4294967296)个表空间,这其中有一部分是为undo和临时表保留的。
共享表空间最多支持2^32(429467296)张表。
在Windows操作系统上,表空间文件的路径(包括文件名),不能超过MAX_PATH。在Windows 10之前,MAX_PATH限制是260个字符。从Windows 10开始,1607版开始,MAX_PATH限制被从普通win32文件和路径函数中移除,但是你必须启用这个新特性。
对于并发读写事务相关的限制,见章节15.6.6,“Undo Logs”