KEY分区与HASH分区类似,也是将数据按照PolarDB-X内置的一致性哈希算法进行分区。因此,PolarDB-X的KEY分区的路由算法与社区MySQL的KEY分区的路由算法并不相同。
KEY分区与HASH分区的区别在于:
KEY分区可以没有分区字段,没有分区字段时,默认将主键字段作为分区键。如果没有主键字段时,则按照唯一键进行分区;
KEY分区支持多列分区字段(即向量分区键),当KEY分区使用了多分区字段组成的向量分区键进行定义时,默认第1个分区列真正起路由作用;
KEY分区支持INT类型、字符类型、DATE类型、DATETIME类型。
语法
CREATE TABLE ...
PARTITION BY KEY(partition_column_list)
PARTITIONS number;
partition_column_list:
partition_column_list[, partition_column, partition_column, ...]
HASH分区策略与KEY分区策略的区别请参见Key分区策略与Hash分区策略对比。
限制
Key分区不支持使用分区函数;
默认最大分区数目不允许超过8192;
默认最大分区列数目不允许超过5个。
示例
使用单列分区键
使用单列分区键id按Key分区,并指定分区数目为8。
CREATE TABLE tb_k(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(id)
PARTITIONS 8;
使用向量分区键
使用向量分区键bid、id按Key分区,并指定分区数目为8。
默认第1个列参与哈希值计算,查询带上前缀分区列等值条件即可命中分区裁剪,后边的未实际路由生效的分区列,如id,将被用于热点分裂。
CREATE TABLE tb_k(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid, id)
PARTITIONS 8;
相关限制
数据类型限制
整数类型: BIGINT/BIGINT UNSINGEDINT/INT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED
时间类型:DATETIME/DATE/TIMESTAMP
字符串类型:CHAR/VARCHR/BINARY
定点类型:DECIMAL(小数部分的位数要求必须是0)
数据均匀性
Key分区与Hash分区内置的一致性Hash散列算法是经过业界广泛测试的、冲突概率低且性能良好的散列算法MurmurHash3。
基于MurmurHash3的特性,一般情况下,当分区键不同取值的数目N大于3000时,Key分区与Hash分区的数据分布才会相对均衡,且N的值越大,数据分布也将越均衡。