15.22 InnoDB的限制

本章讲述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 SizeMaximum Tablespace Size
    4KB16TB
    8KB32TB
    16KB64TB
    32KB128TB
    64KB256TB
    表空间大小最大值同时也是表的最大值。
  • 一个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”