首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb选择shard键

Mongodb选择shard键
EN

Stack Overflow用户
提问于 2013-09-04 13:08:01
回答 1查看 2.5K关注 0票数 2

我有一个mongodb收藏,我想切碎。此集合保存来自用户的消息,来自集合的文档具有以下属性

代码语言:javascript
复制
{
     _id : ObjectId,
     conversationId: ObjectId,
     created: DateTime         
}

所有查询都将使用converstionId属性和创建的排序器来完成。

  • 由于我需要通过conversationId查询(加上_id的ObjectId类型,不能很好地扩展到许多插入),所以_id显然不能正常工作。
  • 在查询隔离方面,通过conversationId进行切分是一种合乎逻辑的选择,但我担心它不会很好地扩展许多插入(即使我在conversationId上使用了散列切分键,或者如果我将属性的类型从ObjectId更改为其他类型,而这种类型不是像GUID那样是增量式的),因为有些会话可能比其他对话更活跃(即:向它们添加更多消息)

根据我在mongo文档中看到的,shard键要么是索引字段,要么是集合中每个文档中存在的索引复合字段。

这是否意味着我可以在复合索引上创建一个碎片键?

底线是:

  • 从_id属性创建散列碎片密钥将提供数据的良好分布。
  • 在conversationId上创建一个切分键将提供良好的查询隔离

因此,如果能做到这两件事的结合,那就太好了。

有什么想法吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-05 13:43:25

对于您的情况,这两个字段看起来都是切分的好选择。例如,如果您在conversationId上分解,它将导致热点,即大部分插入将发生在最后一个碎片,因为随着时间的推移,conversationId会单调地增加。其他两个字段也有相同的问题。

而且,conversationId不会提供高度隔离,因为随着时间的推移,conversationId会单调地增加。(因为更新的对话将比非常老的对话更新得更频繁)

在您的例子中,conversationId上的“散列碎片密钥”(Version2.4)将是明智的选择,因为人们可能会想象会有大量的对话并行进行。

有关创建哈希碎片键的详细信息,请参阅以下链接:[ http://docs.mongodb.org/manual/tutorial/shard-collection-with-a-hashed-shard-key/ ]

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18614748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档