文档

HASH分区

更新时间:

本文介绍了AUTO模式数据库中的HASH分区策略。

语法

PolarDB-X中,把数据按照一致性哈希算法打散到不同的分区上,支持使用分区函数的表达式对分区列的值进行处理的分区策略叫做HASH分区。

PolarDB-X的HASH分区的路由算法与社区MySQL的HASH分区的路由算法并不相同。

CREATE TABLE ... 
PARTITION BY HASH(partition_expr) 
PARTITIONS number;

partition_expr:
    partition_column_list	
  | partition_func(partition_column)

partition_column_list:
  partition_column_list[, partition_column, partition_column, ...]
  
# 分区函数定义
partition_func:
    YEAR
  | TO_DAYS
  | TO_MONTHS
  | TO_WEEKS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH
  | DAYOFWEEK
  | DAYOFMONTH
  | DAYOFYEAR
  | SUBSTR
  | SUBSTRING
  | RIGHT
  | LEFT
说明

HASH分区策略与KEY分区策略的区别请参见Key分区策略与Hash分区策略对比

限制

  • HASH分区的单列分区键支持使用分区函数,但不同分区函数对分区列的数据类型有不同要求。

  • HASH分区的向量分区键不允许使用分区函数,不支持热点分列。

  • 分区列使用分区函数时,不允许嵌套多层的分区函数。

  • 默认最大分区数目不允许超过8192。

  • 默认最大分区列数目不允许超过5个。

  • 使用TIMESTAMP等时区敏感的数据类型作为分区列时,该分区列必须配套地使用UNIX_TIMESTAMP分区函数。

示例

使用分区函数

使用单列分区键datetime并通过分区函数to_days将datetime时间列转换为日期天数,再进行哈希分区,同时指定分区数目为8。

CREATE TABLE tb_h_fn(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY HASH(TO_DAYS(birthday)) 
PARTITIONS 8;

使用单列分区键

使用单列分区键id进行哈希分区,并指定分区数目为8。

CREATE TABLE tb_h(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY HASH(id) 
PARTITIONS 8;

使用向量分区键

使用向量分区键 (id,bid) 进行哈希分区,并指定分区数目为8。

重要

id与bid同时参与哈希值计算,即等值查询必须同时带上id与bid等值条件,才能命中分区裁剪。

CREATE TABLE tb_h2(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30),
 birthday datetime not null,
 primary key(id)
) 
PARTITION BY HASH(id,bid) 
PARTITIONS 8;

相关限制

数据类型限制

  • 整数类型: BIGINT/BIGINT UNSINGEDINT/INT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED

  • 时间类型:DATETIME/DATE/TIMESTAMP

  • 字符串类型:CHAR/VARCHR

数据均匀性

  • Key分区与HASH分区使用内置的一致性HASH散列算法采用是经过业界广泛测试的、冲突概率低且性能良好的散列算法MurmurHash3,但是该算法无法保证在任何情况下各分片的数据分布的均衡性,尤其是分区键不同取值数目比较少的情况;

  • 基于MurmurHash3的特性,一般情况下,当分区键不同取值的数目N大于3000时,Key分区与HASH分区的数据分布才会相对均衡,且N的值越大,数据分布也将越均衡。