MySQL 5.7 键分区

键分区
按键分区类似于按哈希分区,不同的是,哈希分区采用了用户定义的表达式,用于键分区的哈希函数由MySQL服务器提供。NDB集群使用MD5() 来实现这个目的。对于使用其他存储引擎的表,服务器使用自己的内部哈希函数,该函数基于与PASSWORD()相同的算法。

CREATE TABLE … PARTITION BY KEY的语法规则类似于按哈希分区的表。主要区别如下:
.使用KEY而不是HASH

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

mysql> CREATE TABLE k1 (
    -> id INT NOT NULL PRIMARY KEY,
    -> name VARCHAR(20)
    -> )
    -> PARTITION BY KEY()
    -> PARTITIONS 2;
Query OK, 0 rows affected (0.01 sec)

如果没有主键,但有一个唯一键,那么这个唯一键用于分区键:

mysql> CREATE TABLE k1 (
    -> id INT NOT NULL,
    -> name VARCHAR(20),
    -> UNIQUE KEY (id)
    -> )
    -> PARTITION BY KEY()
    -> PARTITIONS 2;
Query OK, 0 rows affected (0.01 sec)

但是,如果唯一键列没有定义为not NULL,那么前面的语句将失败。

在这两种情况下,分区键都是id列,尽管它没有显示在SHOW CREATE TABLE的输出中或INFORMATION_SCHEMA.PARTITIONS表的 PARTITION_EXPRESSION列中。

与其他分区类型不同的是,用于按键分区的列并不局限于整数值或NULL值。例如,下面的CREATE TABLE语句是有效的:

mysql> CREATE TABLE tm1 (
    -> s1 CHAR(32) PRIMARY KEY
    -> )
    -> PARTITION BY KEY(s1)
    -> PARTITIONS 10;
Query OK, 0 rows affected (0.04 sec)

如果指定了不同的分区类型,上述语句将无效。(在这种情况下,简单地使用按键分区()也是有效的,并且与按键分区(s1)的效果相同,因 为s1是表的主键。)

也可以通过线性键对表进行分区。这里有一个简单的例子:

mysql> CREATE TABLE tk (
    -> col1 INT NOT NULL,
    -> col2 CHAR(5),
    -> col3 DATE
    -> )
    -> PARTITION BY LINEAR KEY (col1)
    -> PARTITIONS 3;
Query OK, 0 rows affected (0.02 sec)

使用LINEAR对键分区的效果与对哈希分区的效果相同,分区数是使用2的幂算法而不是模运算得到的。

发表评论

电子邮件地址不会被公开。