系统预置了若干种分片算法供库表分片时使用。算法参数请参见设置分片规则的DDL语句的分片算法内容。
取模分片
定义
对分片键(整数)进行十进制求模,根据模值对应到不同分片。
适用条件:分片键必须是整数,分片键求余后的值均匀分布。
特点
分片键为自增型或随机分布的整数时能保证数据的均匀分片。
算法简单,性能高。
对多值、范围的查询支持较差(分散在不同的分片上)。
扩容时需要数据迁移。
较好的分散由时间、机构、id峰值带来的数据热点问题。
字符串HashCode取模分片
定义
字符串HashCode求模解析(PartitionByStringMod),对分片字段的值进行hashcode()计算并取其绝对值,然后根据配置的分片数量求模得到最终的分片。
特点
数据分布较不均匀。
如果hash算法较差,hash结果存在一定的几率发生碰撞,绝对值计算增加了碰撞的概率。
其余特点同取模分片。
枚举分片
定义
根据配置文件中枚举的具体值(允许非数值)与分片号的对应关系和分片字段的值进行分片,当未找到对应分片时,进入到设定的默认分片。
特点
数据分布的均匀度取决于枚举值对应的记录是否分布均匀。
较好的支持多值、范围的查询。
易于扩容,正常情况下无需数据迁移。
时间范围分片
定义
按照时间范围进行分片,超过分片数量后从第一个分片再次循环分片。
特点
适用日志数据等按时间范围进行存储的数据。
枚举分组取模分片
定义
枚举+取模的组合分片方式,包含枚举键和取模键两个分片键,先通过枚举键将数据分配到不同的分组,再在分组里通过取模键对应到具体的分片。
适用条件: 枚举键可以是整数也可以是字符串,取模键必须是整数,取模键求余后的值均匀分布。如: 数据库的数据需要按区域进行隔离,但隔离后的数据量依然巨大需要按取模方式进行再次分片,可以选择此算法。
特点
支持枚举键和取模键结合进行二次分片。
取模键为自增型或随机分布的整数时能保证数据的均匀分片。
算法简单,性能高。
对多值、范围的查询支持较差(分散在不同的分片上)。
扩容时需要数据迁移。
较好的分散一些时间、机构、id峰值带来的数据热点问题。
枚举分组字符串HashCode取模分片
定义
枚举+字符串HashCode取模的组合分片方式,包含枚举键和取模键两个分片键,先通过枚举键将数据分配到不同的分组,再在分组里通过取模键对应到具体的分片。
适用条件:枚举键可以是整数也可以是字符串,取模键是字符串,取模键字符串HashCode求余后的值均匀分布。如: 数据库的数据需要按区域进行隔离,但隔离后的数据量依然巨大需要按取模方式进行再次分片,可以选择此算法。
特点
支持枚举键和字符串HashCode取模键结合进行二次分片。
算法简单,性能高。
对多值、范围的查询支持较差(分散在不同的分片上)。
扩容时需要数据迁移。
较好的分散一些时间、机构、id峰值带来的数据热点问题。
数值类型Range分片算法
定义
该分片算法依据分片键的连续范围划分数据,将分片键的取值区间分割为不重叠的连续段,每个分片负责存储单一区间内的数据。
每个分片对应的数值范围可以通过设置分片算法时指定。
特点
基于HASH的分片规则,在面对诸如
a>10
这样的非等值规则时,只能在所有分片上进行广播,导致查询性能低下。而Range分片算法,可以通过计算非等值的条件对应的范围,进行分片裁剪,减少非必要的数据节点(DataNode,简称DN)查询,提高性能。以Range范围为(1,10,max value)
为例,如果SELECT语句中包含a<9
,则对应的分片为前2
个,执行查询的时将不再关注第3个分片,可以减少DN查询,有效提高性能。