InnoDB的限制

InnoDB存储引擎有以下限制。

模式限制

  • InnoDB表最多可以有1,017列。这包括虚拟生成列
  • InnoDB表最多可以有64个二级索引。
  • InnoDB上的多列索引可以使用最多16列。如果尝试创建使用超过16列的多列索引,则MariaDB会返回错误1070。

大小限制

  • 除了变长列(即VARBINARYVARCHARBLOBTEXT),InnoDB中的行最大长度约为4KB、8KB、16KB和32KB页面大小的一半。
  • BLOBTEXT列的最大大小为4GB。这也适用于LONGBLOBLONGTEXT
  • MariaDB对所有列的组合大小强制实施65535字节的行大小限制。如果表包含BLOBTEXT列,则在此计算中,它们仅计为9-12字节,因为它们的内容是单独存储的。
  • 32位操作系统具有2GB的最大文件大小限制。在使用此体系结构处理大型表时,请配置InnoDB以使用较小的数据文件。
  • 组合InnoDB日志文件的最大大小为512GB。
  • 对于表空间,最小大小为10MB,最大大小取决于InnoDB Page Size。
InnoDB页面大小最大表空间大小
4KB16TB
8KB32TB
16KB64TB
32KB128TB
64KB256TB

页面大小

使用innodb_page_size系统变量,可以将InnoDB页面的大小配置为字节。页面默认为16KB。对于如何使用此变量,有一些限制。

  • 使用一个页面大小的MariaDB实例不能使用来自使用不同页面大小的实例的数据文件或日志文件。
  • 使用4KB或8KB页面大小时,最大索引键长度会相应降低。
InnoDB页面大小索引键长度
4KB768B
8KB1536B
16KB3072B

大前缀大小

MariaDB 10.3.1之前,innodb_large_prefix系统变量启用了innodb_large_prefix。也就是说,启用时(从MariaDB 10.2开始默认),InnoDB对DYNAMICCOMPRESSED行格式使用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会立即释放表锁。

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.