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的值越大,数据分布也将越均衡。