按键分区
按键分区类似于按哈希分区,除了在哈希分区采用用户定义的表达式的情况下,用于键分区的哈希函数由MySQL服务器提供。NDB群集MD5()
用于此目的;对于使用其他存储引擎的表,服务器使用其自己的内部哈希函数。
语法规则CREATE TABLE ... PARTITION BY KEY
类似于用于创建按哈希分区的表的语法规则。主要区别如下:
KEY
用于而不是HASH
。KEY
仅接受零个或多个列名的列表。如果表有一个主键,则用作分区键的任何列都必须包含表的主键的一部分或全部。如果没有将列名指定为分区键,则使用表的主键(如果有)。例如,以下CREATE TABLE
语句在MySQL 8.0中有效:CREATE TABLE k1 ( id INT NOT NULLPRIMARY 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
或表的PARTITION_EXPRESSION
列中,该键也是该列INFORMATION_SCHEMA.PARTITIONS
。与其他分区类型不同,用于分区依据的列
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
它是表的主键。)有关此问题的更多信息,请参见“分区限制”。
注意
再次使用表的主键作为分区键,对使用
NDB
存储引擎的表进行隐式分区KEY
。如果NDB群集表没有显式主键,则存储引擎为每个NDB群集表生成的“隐藏”主键NDB
将用作分区键。如果为
NDB
表定义显式分区方案,则表必须具有显式主键,并且分区表达式中使用的任何列都必须是该键的一部分。但是,如果表使用“空”分区表达式(即PARTITION BY KEY()
没有列引用),则不需要显式主键。您可以使用ndb_desc实用程序(带有该
-p
选项)观察该分区。重要
对于键分区表,您无法执行
ALTER TABLE DROP PRIMARY KEY
,因为这样做会产生错误ERROR 1466(HY000):在table中找不到分区函数的字段列表中的字段。对于由分区的NDB群集表,这不是问题KEY
。在这种情况下,将使用“ hidden ”主键作为表的新分区键来重组表。请参见MySQL NDB Cluster 8.0。
也可以通过线性键对表进行分区。这是一个简单的示例:
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR(5), col3 DATE )PARTITION BY LINEAR KEY (col1)PARTITIONS 3;
所述LINEAR
关键字对相同的效果KEY
分隔因为它在HASH
分区,使用权力-的二个一个算法,而不是模运算而导出的分区号。有关此算法及其含义的说明,请参见“线性哈希分区”。