在MongoDB中选择正确的分片密钥

在MongoDB中选择正确的分片密钥,mongodb,indexing,sharding,Mongodb,Indexing,Sharding,我们正在构建第一个MongoDB,目前我们正在尝试选择正确的切分键 我们主要收藏的每个文档包含大约40个语音呼叫相关字段,我们在查询中使用的主要字段是UserId字段。这就是为什么我们考虑使用userid和CallStartTime的复合切分键 他们不确定第二个字段,因为StartTime总是在前进,有人可能会说它不够随机。这导致我们考虑用 USERID 和散列id ID/COD>(散列后的Mango内部ID)替换.< /P> 第一个选项可以,还是我们最好使用后者?您执行的是哪种查询?访问模式是

我们正在构建第一个MongoDB,目前我们正在尝试选择正确的切分键

我们主要收藏的每个文档包含大约40个语音呼叫相关字段,我们在查询中使用的主要字段是UserId字段。这就是为什么我们考虑使用
userid
CallStartTime
的复合切分键

他们不确定第二个字段,因为
StartTime
总是在前进,有人可能会说它不够随机。这导致我们考虑用<代码> USERID <代码>和<代码>散列id ID/COD>(散列后的Mango内部ID)替换.< /P>
第一个选项可以,还是我们最好使用后者?

您执行的是哪种查询?访问模式是什么

理想情况下,您需要一个具有良好基数、写扩展和查询隔离的键


在上面的示例中,您需要知道callstarttime或hash以避免分散-聚集操作。

考虑以下文档中的建议:

或者,如果没有自然选择,考虑使用散列碎片密钥(MangGDB 2.4 +)


你可以在上面使用散列索引:而且,这感觉更像是一个系统管理问题……我还考虑了散列键:“……用UserId+hash\u id(散列后的mongo internal id)替换它…”不是真的-为了避免散列聚集,你至少需要有主键,这是可以的。我们的大多数查询都是基于UserId的。我们也可能有使用上次更新时间的查询,因此我们考虑将切分键设置为userid+上次更新时间。