KEY分区
KEY分区与HASH分区相似,当然有不同点
(1)在HASH分区中,可以使用整数列或者基于列值的表达式,即PARTITION BY HASH(expr),而在KEY分区中,直接基于列,PARTITION BY KEY(column_list),column_list是列名列表,这有点像LIST分区和LIST COLUMNS分区,一个基于列值或者列值表达式,另一个直接基于列值或者列值列表;
(2)在HASH分区中,使用表达式expr对分区数num求模MOD(expr,num)来计算数据行的分区号,而在KEY分区中,使用MySQL服务器的哈希函数,NDB集群使用MD5(),对于使用其他存储引擎的表,服务器使用自己的内部哈希函数,该函数基于与PASSWORD()相同的算法;
(2)KEY分区可以接收0个或者多个列,即PARTITION BY KEY()或者PARTITION BY KEY(column_list);
基于INT类型字段,创建KEY分区:
CREATE TABLE k1 (
id INT,
name VARCHAR(20)
)
PARTITION BY KEY(id)
PARTITIONS 2;
基于VARCHAR类型,创建KEY分区:
CREATE TABLE k1 (
id INT,
name VARCHAR(20)
)
PARTITION BY KEY(name)
PARTITIONS 2;
基于多个列创建分区:
CREATE TABLE k1 (
id INT ,
name VARCHAR(20)
)
PARTITION BY KEY(id,name)
PARTITIONS 2;
(3)如果表有主键,用作分区键的任何列必须是表的主键,如果没有指定列名作为分区键,则使用表的主键(如果有主键),例如:
CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;
KEY()中并没有指定具体的列,则使用主键id作为分区键。等价于
CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY(id)
PARTITIONS 2;
如下方式创建KEY分区会报错:
CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY(name)
PARTITIONS 2;
(4)如果没有主键,但是有一个唯一键,那么分区键的任何列都必须是唯一键的一部分。例如:
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;
k1中没有主键,但是定义了唯一键id,使用唯一键作为分区键。
如果唯一键没有定义为NOT NULL,会报错,如下:
如下三种方式都可以创建KEY分区表:
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id,name)
)
PARTITION BY KEY(id)
PARTITIONS 2;
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id,name)
)
PARTITION BY KEY(name)
PARTITIONS 2;
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id,name)
)
PARTITION BY KEY(id,name)
PARTITIONS 2;
但是如下方式创建分区表还会报错:
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id,name)
)
PARTITION BY KEY()
PARTITIONS 2;
原因是KEY()中并未指定列。
注:向KEY分区表中插入数据,数据存储到哪个分区并不一定使用的是像HASH分区中的求模运算
LINEAR KEY分区
与LINEAR HASH分区类似,LINEAR KEY分区使用的也是二次幂(powers-of-two)算法,分区创建语法如下:
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;