按键分区类似于按哈希分区,不同之处是哈希分区使用用户定义的表达式,键分区的哈希函数是由MySQL服务器提供的。NDB集群使用MD5 ()
为此目的;对于使用其他存储引擎的表,服务器使用自己的内部哈希函数,该函数基于相同的算法密码()
。
的语法规则创建表…按键分区
类似于创建按散列分区的表。主要区别如下:
关键
而不是哈希
。关键
只接受零个或多个列名的列表。任何用作分区键的列都必须包含表的部分或全部主键(如果表有主键的话)。如果没有指定列名作为分区键,则使用表的主键(如果有的话)。例如创建表
语句在MySQL 5.7中有效:CREATE TABLE k1 (id INT NOT NULL PRIMARY KEY, name VARCHAR(20))
如果没有主键但有唯一键,则分区键使用唯一键:
CREATE TABLE k1 (id INT NOT NULL, name VARCHAR(20), UNIQUE KEY(id))
但是,如果唯一键列没有定义为
非空
,则前面的语句将失败。在这两种情况下,分区键都是
id
列的输出中没有显示显示创建表
或者在PARTITION_EXPRESSION
的列INFORMATION_SCHEMA。分区
表格与其他分区类型不同的是,列用于分区
关键
不限制为整数或零
值。例如创建表
语句有效:创建表tm1 (s1 CHAR(32))分区
前面的语句将不如果要指定不同的分区类型,则该参数有效。(在这种情况下,简单地使用
按键()分区
也是有效的,和分区键(s1)
,因为s1
是表的主键。)有关此问题的详细信息,请参见第22.6节“分区的限制和限制”。
分区键中不支持带索引前缀的列。这意味着
字符
,VARCHAR
,二进制
,VARBINARY
列可以在分区键中使用,只要它们不使用前缀;因为必须指定前缀团
而且文本
索引定义中的列,不能在分区键中使用这两种类型的列。在MySQL 5.7中,当创建、修改或升级分区表时,使用前缀的列是允许的,即使它们不包括在表的分区键中。这是MySQL 5.7中的一个已知问题,在MySQL 8.0中已经解决了这个问题,在MySQL 8.0中这种允许行为已被弃用,并且当试图在这些情况下使用这些列时,服务器会显示适当的警告或错误。看到键分区不支持列索引前缀,以了解更多资料及例子。请注意表使用
NDB
存储引擎被隐式分区关键
,使用表的主键作为分区键(与其他MySQL存储引擎一样)。如果NDB Cluster表没有显式的主键,则”隐藏的”属性生成的主键NDB
每个NDB集群表的存储引擎被用作分区键。的显式分区方案
NDB
表,表必须有一个显式的主键,分区表达式中使用的任何列都必须是这个键的一部分。但是,如果表使用”空”分区表达式,即,按键()分区
如果没有列引用,则不需要显式主键。可以使用ndb_desc实用程序(使用
- p
选项)。重要的对于键分区的表,不能执行
修改表删除主键
,因为这样做会生成错误错误1466 (HY000):分区函数字段列表中的字段在表中没有找到。对于分区的NDB集群表,这不是一个问题关键
;类对表进行重新组织”隐藏的”主键作为表的新分区键。看到21章,MySQL NDB集群7.5和NDB集群7.6。
也可以用线性键来划分一个表。这里有一个简单的例子:
CREATE TABLE tk (col1 INT NOT NULL, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY (col1) PARTITIONS 3;
使用线性
有同样的效果关键
分区的时候哈希
分区,使用2的幂算法而不是模数算法导出分区号。看到第22.2.4.1节,“线性HASH分区”参阅此算法的描述及其含义。