MySQL 9.0 参考手册  /  ...  /  KEY 分区

26.2.5 KEY 分区

按键分区类似于按哈希分区,区别在于哈希分区使用用户定义的表达式,而键分区的哈希函数由 MySQL 服务器提供。NDB 集群为此目的使用 MD5();对于使用其他存储引擎的表,服务器使用其自身的内部哈希函数。

用于 CREATE TABLE ... PARTITION BY KEY 的语法规则类似于创建按哈希分区的表的规则。主要区别如下

  • KEY 用于代替 HASH

  • KEY 只接受零个或多个列名的列表。如果表有一个主键,则用作分区键的任何列都必须包含主键的一部分或全部。如果没有列名指定为分区键,则使用表的表主键(如果有)。例如,以下 CREATE TABLE 语句在 MySQL 9.0 中有效

    CREATE TABLE k1 (
        id INT NOT NULL PRIMARY KEY,
        name VARCHAR(20)
    )
    PARTITION BY KEY()
    PARTITIONS 2;

    如果没有主键但有唯一键,则使用唯一键作为分区键

    CREATE TABLE k1 (
        id INT NOT NULL,
        name VARCHAR(20),
        UNIQUE KEY (id)
    )
    PARTITION BY KEY()
    PARTITIONS 2;

    但是,如果唯一键列未定义为 NOT NULL,则前面的语句将失败。

    在这两种情况下,分区键都是 id 列,即使它未在 SHOW CREATE TABLE 的输出中显示,也未在信息架构 PARTITIONS 表的 PARTITION_EXPRESSION 列中显示。

    与其他分区类型不同,用于按 KEY 分区的列不受限于整型或 NULL 值。例如,以下 CREATE TABLE 语句有效

    CREATE TABLE tm1 (
        s1 CHAR(32) PRIMARY KEY
    )
    PARTITION BY KEY(s1)
    PARTITIONS 10;

    如果指定不同的分区类型,则前面的语句将无效。(在这种情况下,简单地使用 PARTITION BY KEY() 也会有效,并与 PARTITION BY KEY(s1) 具有相同的效果,因为 s1 是表的表主键。)

    有关此问题的更多信息,请参见 第 26.6 节,“分区的限制和局限性”

    分区键不支持带有索引前缀的列。这意味着 CHARVARCHARBINARYVARBINARY 列可以在分区键中使用,只要它们不使用前缀即可;因为索引定义中必须为 BLOBTEXT 列指定前缀,所以不可能在分区键中使用这两种类型的列。服务器会拒绝任何 CREATE TABLEALTER TABLE 语句,这些语句影响一个分区的表,其中一个或多个使用前缀的列与错误一起出现。请参见 分区键不支持列索引前缀

    注意

    使用 NDB 存储引擎的表隐式地按 KEY 分区,使用表的表主键作为分区键(与其他 MySQL 存储引擎一样)。如果 NDB 集群表没有显式主键,则 NDB 存储引擎为每个 NDB 集群表生成的隐藏主键将用作分区键。

    如果你为 NDB 表定义一个显式分区方案,则该表必须具有显式主键,并且分区表达式中使用的任何列都必须是该主键的一部分。但是,如果表使用分区表达式(即,PARTITION BY KEY() 没有列引用),则不需要显式主键。

    你可以使用 ndb_desc 实用程序(带有 -p 选项)观察此分区。

    重要

    对于按键分区的表,你不能执行 ALTER TABLE DROP PRIMARY KEY,因为这样做会导致错误 ERROR 1466 (HY000): Field in list of fields for partition function not found in table。对于按 KEY 分区的 NDB 集群表来说,这不是问题;在这种情况下,将使用隐藏主键作为表的新的分区键重新组织表。请参见 第 25 章,MySQL NDB 集群 9.0

还可以按线性键分区表。这是一个简单的例子

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

LINEAR 关键字对 KEY 分区的影响与对 HASH 分区的影响相同,分区号是使用二的幂算法而不是模运算得出的。请参见 第 26.2.4.1 节,“LINEAR HASH 分区”,以了解该算法及其含义的描述。