哈希分片使用哈希索引在共享群集中对数据进行分区。散列索引计算单个字段的哈希值作为索引值;此值用作您的分片密钥。[1]
散列分片以减少“ 目标操作”与“广播操作”为代价,在整个分片群集中提供了更均匀的数据分布。哈希后的,具有“接近”分片键值的文档不太可能位于同一块或分片上- mongos
更有可能执行
广播操作来满足给定的范围查询。
mongos
可以将具有相等匹配项的查询定位到单个分片。
小费
使用哈希索引解析查询时,MongoDB自动计算哈希值。应用程序也不会需要计算哈希值。
警告
MongoDB hashed
索引在散列之前将浮点数截断为64位整数。例如,hashed
指数将存储用于持有的值的字段的值相同2.3
,2.2
和2.9
。为防止冲突,请勿hashed
对无法可靠转换为64位整数(然后再返回到浮点数)的浮点数使用索引。MongoDB hashed
索引不支持大于2 53的浮点值。
要查看键的哈希值是多少,请参见
convertShardKeyToHashed()
。
[1] | 从4.0版开始,mongo shell提供了method convertShardKeyToHashed() 。此方法使用与哈希索引相同的哈希函数,可用于查看密钥的哈希值。 |
您选择作为哈希分片键的字段应具有良好的
基数或大量不同的值。哈希键非常适合具有像ObjectId值或时间戳那样单调更改的字段的分片键
。一个很好的例子是默认字段,假设它仅包含ObjectID值。_id
要使用散列的分片键分片集合,请参见分片 集合。
给定一个使用单调递增的值X
作为分片键的集合,使用范围分片会导致传入插入的分布类似于以下内容:
由于的值X
始终在增加,因此具有maxKey上限的块将接收大多数传入的写操作。这将插入操作限制为包含该块的单个分片,从而减少或消除了分片群集中分布式写入的优势。
通过在上使用哈希索引X
,插入的分布类似于以下内容:
由于现在数据分布更加均匀,因此可以在整个群集中高效地分布插入内容。
使用该sh.shardCollection()
方法,指定集合的完整名称空间以及
用作分片键的目标哈希索引。
重要
分片集合后,分片键的选择是不变的。即,您不能为该集合选择其他分片键。
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
如果使用哈希分片键对填充的集合进行分片:
如果您使用哈希分片键对空集合进行分片:
numInitialChunks
option指定不同数量的初始块。块的这种初始创建和分配允许更快地设置分片。