按键分区类似于按哈希分区,区别在于哈希分区使用用户定义的表达式,而键分区使用的哈希函数由 MySQL 服务器提供。NDB 集群使用 MD5()
用于此目的;对于使用其他存储引擎的表,服务器使用其自己的内部哈希函数。
用于 CREATE TABLE ... PARTITION BY KEY
的语法规则类似于创建按哈希分区的表的语法规则。主要区别列示如下:
KEY
用于代替HASH
。KEY
只接受零个或多个列名的列表。如果表有主键,则用作分区键的任何列都必须包含主键的一部分或全部。如果未指定列名作为分区键,则使用表的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
的输出中,也没有显示在 Information SchemaPARTITIONS
表的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 节,“分区限制和局限性”。
分区键不支持带有索引前缀的列。这意味着
CHAR
、VARCHAR
、BINARY
和VARBINARY
列可用于分区键,只要它们不使用前缀;因为必须为BLOB
和TEXT
列在索引定义中指定前缀,所以无法在分区键中使用这两种类型的列。在 MySQL 的旧版本中,在创建、更改或升级注意使用
NDB
存储引擎的表会隐式地按KEY
进行分区,使用表的如果为
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 集群表来说,这
也可以按线性键对表进行分区。以下是一个简单的示例:
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 分区”,了解此算法及其含义的描述。