InnoDB的限制
InnoDB存储引擎有以下限制。
模式限制
- InnoDB表最多可以有1,017列。这包括虚拟生成列。
- InnoDB表最多可以有64个二级索引。
- InnoDB上的多列索引可以使用最多16列。如果尝试创建使用超过16列的多列索引,则MariaDB会返回错误1070。
大小限制
- 除了变长列(即VARBINARY、VARCHAR、BLOB和TEXT),InnoDB中的行最大长度约为4KB、8KB、16KB和32KB页面大小的一半。
- BLOB和TEXT列的最大大小为4GB。这也适用于LONGBLOB和LONGTEXT。
- MariaDB对所有列的组合大小强制实施65535字节的行大小限制。如果表包含BLOB或TEXT列,则在此计算中,它们仅计为9-12字节,因为它们的内容是单独存储的。
- 32位操作系统具有2GB的最大文件大小限制。在使用此体系结构处理大型表时,请配置InnoDB以使用较小的数据文件。
- 组合InnoDB日志文件的最大大小为512GB。
- 对于表空间,最小大小为10MB,最大大小取决于InnoDB Page Size。
InnoDB页面大小 | 最大表空间大小 |
---|---|
4KB | 16TB |
8KB | 32TB |
16KB | 64TB |
32KB | 128TB |
64KB | 256TB |
页面大小
使用innodb_page_size系统变量,可以将InnoDB页面的大小配置为字节。页面默认为16KB。对于如何使用此变量,有一些限制。
- 使用一个页面大小的MariaDB实例不能使用来自使用不同页面大小的实例的数据文件或日志文件。
- 使用4KB或8KB页面大小时,最大索引键长度会相应降低。
InnoDB页面大小 | 索引键长度 |
---|---|
4KB | 768B |
8KB | 1536B |
16KB | 3072B |
大前缀大小
在MariaDB 10.3.1之前,innodb_large_prefix系统变量启用了innodb_large_prefix。也就是说,启用时(从MariaDB 10.2开始默认),InnoDB对DYNAMIC
和COMPRESSED
行格式使用3072B索引键前缀。禁用时,它对任何行格式的表使用787B键前缀。使用超过此限制的索引键会引发错误。
从MariaDB 10.3.1开始,InnoDB始终使用大的索引键前缀。
表限制
InnoDB具有以下特定于表的限制。
- 当发出DELETE语句时,InnoDB不会重新生成表,而是逐个从表中删除每一行。
- 在Windows上运行MariaDB时,InnoDB将数据库和表存储为小写。在以二进制格式从Windows移动数据库和表到类Unix系统或从Unix系统到Windows时,需要重命名这些名称以使用小写。
- 当使用级联外键时,级联中的操作不会激活触发器。
表分析
MariaDB支持使用ANALYZE TABLE SQL语句来分析和存储表键分布。当MariaDB执行此语句时,它通过对索引树进行随机潜水来计算索引基数。这使其快速,但不总是准确,因为它不检查所有行。数据仅为估计值,并且重复执行此语句可能会返回不同的结果。
在需要精确数据的情况下,从ANALYZE TABLE语句中获取准确数据,请启用innodb_stats_persistent系统变量。此外,您可以使用innodb_stats_transient_sample_pages系统变量来更改其执行的随机潜水次数。
在运行语句或事务的表上两次运行ANALYZE TABLE时,MariaDB会阻止第二个ANALYZE TABLE,直到语句或事务完成。这是因为语句或事务阻止第二个ANALYZE TABLE语句重新加载表定义,它必须这样做,因为旧的定义在第一个语句之后被标记为过时。
表状态
与ANALYZE TABLE语句类似,SHOW TABLE STATUS语句对InnoDB提供的统计信息不准确,除了物理表大小。
InnoDB存储引擎不维护内部行计数。事务隔离写入,这意味着并发事务将没有相同的行计数。
自动增量列
- 在自动增量列上定义索引时,必须以允许在表上进行等效的
SELECT MAX(col)
查找的方式进行定义。 - 重新启动MariaDB可能会导致InnoDB重用旧的自动增量值,例如在回滚的情况下。
- 当自动增量列用完值时,INSERT语句将生成重复键错误。
事务和锁
- 您最多可以修改96 * 1023个生成撤消记录的并发事务上的数据。
- 在128个回滚段中,InnoDB为修改临时表及其相关对象的事务分配32个非重做日志,将最大并发数据修改事务数从128,000减少到96,000。
- 当所有数据修改事务也修改临时表时,限制为32,000个并发事务。
- 发出LOCK TABLES语句时,当启用innodb_table_locks系统变量(默认值)时,每个表设置两个锁。
- 当提交或回滚事务时,释放在事务中设置的任何锁。当启用autocommit变量时,您不需要发出LOCK TABLES语句,因为InnoDB会立即释放表锁。