Mysql之InnoDB限制

162 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

前言

对于InnodDB对表、索引、表空间和InnoDB存储引擎其他方面的限制,笔者也了解的比较少,对于这些限制当达到的时候自然会触发,但是了解这些限制可以对InnoDB的设计有一定的了解。

限制

  • 一个表最多包含1017列。虚拟生成的列包含此限制中。

  • 一个表最多可以包含64个二级索引。(一级为聚簇索引就一个)。

  • InnoDB对于使用DYNAMIC或者COMPACT行格式的表,索引健前缀长度限制为3072字节。

    对于使用REDUNDANT或者COMPACT行格式的InnoDB前缀索引长度限制为767个字节。例如,如果你在TEXT或者VARCHAR列上创建一个列前缀索引超过191字符也许会触发这个限制,假设设置了utf8mb4字符集并且每个字符最多4个字节。

    尝试使用的前缀索引长度达到了限制就会返回错误。

    当创建MySQL实例时如果你通过innodb_page_size选项减少InnoDB page size至8KB或者4KB,则索引的最大长度将按16k页大小的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。

    如果一行的长度小于半页,则被存储在本地页内。如果超过半页,则可变长列是被选择存储在页外直到该行适合半页,如 第 15.11.2 节,“文件空间管理”中所述。

  • 尽管InnoDB内部支持大于65,535字节的行大小,但是MySQL本身对所有列的组合大小施加了65,535的行大小限制。请参阅 第 8.4.7 节,“表列数和行大小的限制”

  • 在某些较旧的操作系统上,文件必须小于2GB。这不是InnoDB限制。如果您需要一个大型系统表空间,请使用几个较小的数据文件而不是一个大型数据文件对其进行设置,或者跨每个表的文件和常规表空间数据文件分布表数据。

  • InnoDB日志文件的组合最大大小为512GB。

  • 最小表空间大小略大于10MB,最大表空间大小取决于InnoDB页大小。 表 15.31 InnoDB 最大表空间大小

InnoDB 页面大小最大表空间大小
4KB16TB
8KB32TB
16KB64TB
32KB128TB
64KB256TB

最大表空间大小也是表的最大大小。

  • 一个InnoDB实例最多支持 2^32 (4294967296) 个表空间,其中少数表空间保留用于undo表和临时表。
  • 共享表空间最多支持 2^32 (4294967296) 个表。
  • 表空间文件的路径,包括文件名,在 Windows 上不能超过MAX_PATH限制。在 Windows 10 之前,MAX_PATH限制为 260 个字符。从 Windows 10 版本 1607 开始, MAX_PATH限制已经被从常见 Win32 文件和目录功能中删除,但您必须启用新行为。
  • 有关与并发读写事务相关的限制,请参阅第 15.6.6 节,“undo日志”

参考

官方文档