在 MySQL 8.3 中,分区支持不是由 MySQL 服务器提供的,而是由表存储引擎自己的或本机分区处理程序提供。在 MySQL 8.3 中,只有 InnoDB
和 NDB
存储引擎提供本机分区处理程序。这意味着分区表不能使用其他存储引擎创建。(您必须使用 MySQL NDB 集群的 NDB
存储引擎来创建 NDB
表。)
InnoDB 存储引擎。 InnoDB
外键和 MySQL 分区不兼容。分区的 InnoDB
表不能有外键引用,也不能有被外键引用的列。InnoDB
表如果有或被外键引用的列不能被分区。
ALTER TABLE ... OPTIMIZE PARTITION
不适用于使用 InnoDB
的分区表。相反,使用 ALTER TABLE ... REBUILD PARTITION
和 ALTER TABLE ... ANALYZE PARTITION
,详见 第 15.1.9.1 节,“ALTER TABLE 分区操作”。
用户定义的分区和 NDB 存储引擎(NDB 集群)。 对于 NDB
存储引擎,仅支持按 KEY
(包括 LINEAR KEY
)分区。通常情况下,在 NDB 集群中无法创建使用其他分区类型的 NDB 表,尝试这样做将失败并报错。
例外(不适用于生产): 通过在 NDB 集群 SQL 节点上将 new
系统变量设置为 ON
,可以 override 这个限制。如果您选择这样做,请注意使用其他分区类型的表不是生产支持的。在这种情况下,您可以创建和使用其他分区类型的表,但您完全承担风险。您还应该注意,这个功能现在已弃用,并将在未来的 NDB 集群版本中删除。
对于 NDB
表,可以定义的最大分区数取决于集群中的数据节点和节点组的数量、NDB 集群软件的版本以及其他因素。详见 NDB 和用户定义的分区。
在 NDB
表中,每个分区可以存储的固定大小数据的最大量为 128 TB。之前,这个限制是 16 GB。
CREATE TABLE
和 ALTER TABLE
语句,如果导致用户定义的 NDB
表不满足以下两个要求之一,将失败并报错:
-
表必须有一个明确的主键。
-
所有列都必须是主键的一部分。
例外。 如果用户定义的 NDB
表使用空列列表创建(即使用 PARTITION BY KEY()
或 PARTITION BY LINEAR KEY()
),那么不需要明确的主键。
分区选择 对于 NDB
表,不支持分区选择。请参阅 第 26.5 节,“分区选择”,以获取更多信息。
升级分区表 在执行升级时,必须将按 KEY
分区的表dump 并重新加载。
使用存储引擎其他于 InnoDB
的分区表无法从 MySQL 5.7 或更早版本升级到 MySQL 8.0 或更高版本;您必须使用 ALTER TABLE ... REMOVE PARTITIONING
删除这些表的分区或使用 ALTER TABLE ... ENGINE=INNODB
将其转换为 InnoDB
,然后再升级。
有关将 MyISAM
表转换为 InnoDB
的信息,请参阅 第 17.6.1.5 节,“将表从 MyISAM 转换为 InnoDB”。