Mongodb选择分片键
我有一个mongodb收藏,我想分享。此集合保存来自用户的消息,集合中的文档具有以下属性Mongodb选择分片键,mongodb,sharding,Mongodb,Sharding,我有一个mongodb收藏,我想分享。此集合保存来自用户的消息,集合中的文档具有以下属性 { _id : ObjectId, conversationId: ObjectId, created: DateTime } 所有查询都将使用ConversationID属性和由创建的分类器来完成 按\u id分片显然不起作用,因为我需要按会话id进行查询(另外\u id属于ObjectId类型,无法很好地扩展到许多插入) 按照conversationI
{
_id : ObjectId,
conversationId: ObjectId,
created: DateTime
}
所有查询都将使用ConversationID属性和由创建的分类器来完成
- 按\u id分片显然不起作用,因为我需要按会话id进行查询(另外\u id属于ObjectId类型,无法很好地扩展到许多插入)
- 按照conversationId进行切分在查询隔离方面是一个合乎逻辑的选择,但我担心它不能很好地扩展许多插入(即使我在conversationId
- 从\u id属性创建散列切分键将提供良好的数据分布
- 在会话ID上创建切分键将提供良好的查询隔离
感谢您的案例,这两个字段都不是切分的好选择。例如,如果您在conversationId上进行切分,则会导致热点,即您的大多数插入都会发生在最后一个切分上,因为conversationId会随着时间单调增加。其他两个字段也存在同样的问题 此外,conversationId不会提供高度隔离,因为conversationId会随时间单调增加。(因为较新的对话会比非常旧的对话更新得更频繁) 在您的情况下,在conversationId上使用“哈希切分键”(版本2.4以后)将是一个明智的选择,因为您可以想象会有大量的对话并行进行
有关创建哈希切分键的详细信息,请参阅以下链接:[]对于您的情况,这两个字段都不是切分的好选择。例如,如果您在conversationId上进行切分,则会导致热点,即您的大多数插入都会发生在最后一个切分上,因为conversationId会随着时间单调增加。其他两个字段也存在同样的问题 此外,conversationId不会提供高度隔离,因为conversationId会随时间单调增加。(因为较新的对话会比非常旧的对话更新得更频繁) 在您的情况下,在conversationId上使用“哈希切分键”(版本2.4以后)将是一个明智的选择,因为您可以想象会有大量的对话并行进行
有关创建哈希切分键的详细信息,请参阅以下链接:[]谢谢您的评论。我确实这样做了,但在将数据复制到分片集合的中途,我在_id属性上得到了“E11000 duplicate key error index”,这很奇怪,因为我在我的初始集合中找不到该id的任何副本复制集合中的错误Safemode检测到错误“在版本7 | 83 | | | 5228504705A8GE238D3627B::向碎片集插入1个文档时出错,原因是::E11000重复键错误索引:消息。$\u id_uudup键:{:ObjectId(“…”)}谢谢您的评论。我确实这样做了,但在将数据复制到分片集合的中途,我在_id属性上得到了“E11000 duplicate key error index”,这很奇怪,因为我在我的初始集合中找不到该id的任何副本复制集合中的错误Safemode检测到错误“将1个文档插入版本7 | 83 | | 5228504705A8GE238D3627B::的碎片集时出错,原因是::E11000重复键错误索引:消息。$\u id_uudup键:{:ObjectId('..')}”