按键分区类似于散列的分区,除了散列分区采用用户定义的表达式之外,MySQL Server提供了用于密钥分区的散列函数。NDB集群使用MD5()
以此目的;对于使用其他存储引擎的表,服务器采用其自己的内部散列函数。
语法规则创建表...按键分区
类似于创建由哈希分区的表的那些。此处列出了主要差异:
钥匙
使用而不是哈希
。钥匙
只占用零个或多个列名的列表。如果表格有一个,则使用用作分区密钥的任何列必须包含零件或全部。如果没有将列名指定为分区密钥,则使用表的主键,如果有一个。例如,以下创建表
声明在MySQL 8.0中有效:通过key()分区2,创建表k1(ID int not noul null主键,name varchar(20))分区;
如果没有主键,但有一个唯一的键,则唯一密钥用于分区密钥:
CREATE TABLE K1(ID INT NOT NULL NULL,NAME VARCHAR(20),按键()分区2的分区;
但是,如果唯一的键列未被定义为
没有空
,然后前一个陈述将失败。在这两个情况下,分区密钥是
ID
列,即使它未在输出中显示显示创建表
或者在partition_expression.
栏目Information_schema.Partitions.
桌子。与其他分区类型的情况不同,用于划分的列
钥匙
不限于整数或空值
价值观。例如,以下创建表
声明有效:通过键(S1)分区10创建表TM1(S1 Char(32)主键)分区;
前面的陈述将不是有效,是要指定不同的分区类型。(在这种情况下,只需使用
按键分区()
也有效并具有相同的效果按键分区(S1)
, 自从S1
表的主键是。)有关此问题的其他信息,请参阅第24.6节“分区的限制和限制”。
分区键不支持具有索引前缀的列。这意味着
char
那varchar.
那二进制
, 和varbinary.
可以在分区密钥中使用列,只要它们不采用前缀;因为必须指定前缀斑点
和文本
索引定义中的列,无法在分区密钥中使用这两种类型的列。在MySQL 8.0.21之前,在创建,更改或升级分区表时允许使用前缀的列,即使它们不包含在表的分区密钥中;在MySQL 8.0.21及更高版本中,不推荐使用此允许行为,并且服务器在使用一个或多个此类列时显示适当的警告或错误。看密钥分区不支持列索引前缀,有关更多信息和示例。笔记表使用的表格
NDB.
存储引擎隐式划分钥匙
,使用表的主键作为分区密钥(与其他MySQL存储引擎一样)。如果NDB群集表没有显式主键,则“隐“由此产生的主要键NDB.
每个NDB群集表的存储引擎用作分区键。如果您定义了一个显式分区方案
NDB.
表,表必须具有显式主键,并且分区表达式中使用的任何列必须是此键的一部分。但是,如果表使用了“空的“分区表达式 - 即按键分区()
没有列引用 - 然后不需要显式主键。您可以使用该分区使用ndb_desc.效用(与
-P.
选项)。重要的对于键分区表,无法执行
更改表丢弃主键
,这样做会产生错误错误1466(hy000):字段中未在表中找不到的分区功能列表中的字段。这不是NDB群集表的问题,该表钥匙
;在这种情况下,该表将使用该表进行重新组织“隐“主键作为表的新分区密钥。看第23章,MySQL NDB集群8.0。
也可以通过线性键分区表。这是一个简单的例子:
通过线性键(COL1)分区3,创建表TK(Col1 Int Not Null,Col2 Char(5),Col3日期)分区;
这线性
关键字对此效果相同钥匙
分区正如在那样哈希
分区,使用两个算法而不是模数算法导出分区号。看第24.2.4.1节“线性哈希分区”,用于描述该算法及其含义。