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的值越大,數據分布也將越均衡。