哈希(Hashed)索引
哈希索引收集并存储索引字段值的哈希值。
哈希索引支持使用哈希分分片键的分片。基于哈希的分片 使用字段的哈希索引作为分片键,在分片集群中对数据分区。
用例
哈希索引非常适合具有像 ObjectId 值或时间戳这样单调变化字段的分片键。当您使用具有单调递增分片键值的范围分片时,上限为 MaxKey
的数据块将接收大多数传入写入。这种行为将插入操作限制为单个分片,从而消除了分片集群中分布式写入的优势。
有关为应用程序选择最佳分片方法的更多信息,请参阅哈希分片与范围分片对比。
行为
浮点数
哈希索引会在行哈希运算之前将浮点数截断为 64 位整数。例如,哈希索引使用相同的哈希来存储值 2.3
、2.2
和 2.9
。这是一种冲突,其中的多个值被分配给单个哈希键。冲突可能会对查询性能产生负面影响。
为防止冲突,请勿对无法可靠转换为 64 位整数(然后再转换回浮点数)的浮点数使用哈希索引。
哈希索引不支持大于 253 的浮点数。
限制
哈希索引对数组字段和唯一属性有限制。
数组字段
哈希函数不支持多键索引。您无法在包含数组的字段上创建哈希索引,也无法将数组插入哈希索引字段。
唯一约束
不能在哈希索引上指定唯一约束。相反,您可以创建具有唯一约束的附加非哈希索引。MongoDB 可以使用该非哈希索引来强制实施所选字段的唯一性。
开始体验
要创建哈希索引,请参阅创建哈希索引。
详情
本部分介绍哈希索引的技术细节。
哈希函数
重要
当 MongoDB 使用哈希索引解析查询时,会使用哈希函数自动计算哈希值。应用程序无需计算哈希值。
要查看某个键的哈希值,请使用 convertShardKeyToHashed()
方法。此方法使用与哈希索引相同的哈希函数。
嵌入式文档
哈希函数会折叠嵌入的文档,并计算整个值的哈希值。