MongoDB 中的哈希索引用例

ham*_*fzm 4 index mongodb

最近 MongoDB 为其功能添加了哈希索引,但在文档中并没有过多解释哈希索引用例及其对普通 MongoDB 索引的特权。因此,如果您能指导我了解更多信息,我将不胜感激。

Ste*_*nie 6

在 MongoDB 2.4(2013 年 3 月)中添加了散列索引,专门用于支持散列分片键。我不知道分片之外的任何用例。

选择一个片键可以大体定义自己的复合索引得到最好的结果(读/写地方的适当平衡)。但是,有效的分片键需要了解您选择的字段的属性(例如基数、可分性、随机性)以及您的应用程序用例(常见更新/读取查询)。分片键索引中包含的字段也需要存在于每个文档中,并且在插入后不能更改。

如果无法根据您的数据自然选择分片键,则可以使用散列分片键来实现更均匀的值分布,这将有助于跨多个分片分布写入。被散列的字段仍然需要具有良好的基数(即大量不同的值),因此ObjectId值或时间戳可以很好地工作。散列分片键的缺点是它支持相等查询,但不能用于范围查询,因为索引中的值是有效分布的。

例如,默认值_id( ObjectId ) 包括一个前导时间戳组件。虽然该_id字段是唯一的、不可变的并且存在于每个文档中,但ObjectId它不适合作为分片键,因为值是单调递增的。如果您对一个不断增加的值进行分片ObjectId,例如,则所有新插入都将针对当前具有最高分片键值的单个“热”分片。然后必须将文档重新平衡到您的其他分片,这会使您的分片无法扩展——一个分片不佳的集合将受到单个分片的写入吞吐量以及频繁重新平衡新插入数据的开销的限制碎片之间。

有关更多信息,请参阅:使用散列分片键分片集合

  • 嗯,由于散列是有符号(大?)整数,很可能对散列索引进行排序更有效。一个用例是,如果您想以*某种*顺序遍历所有文档并希望防止自然排序,这可能会在大型结果集中多次返回单个文档。 (2认同)