首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB模式性能优化

MongoDB模式性能优化
EN

Stack Overflow用户
提问于 2015-09-27 16:32:36
回答 2查看 983关注 0票数 0

你好,我想要构建性能最好的mongoDB模式。

一般来说,我的问题是:

什么更好:集合中有巨大的子文档数组(大约10000),或者两个与引用分离的集合(其中一个可能包含50000000条记录)?

详细资料

我有一个包含复杂子文档的mongoDB模型。

代码语言:javascript
运行
复制
var usersSchema = new Schema({
email:{
    type: String,
    unique: true,
    required: true
},
packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]
});

每个用户可能会有3-10个包含1000个单词的软件包.应用程序可能有超过10000的用户。所以我大概要存五万字左右。但我希望有分页、普通搜索和另一个多汁的mongoDB功能,用于收集words。但是,正如我所知,在子文档中使用这个函数是非常困难的。

我的问题是:对于具有无效分页、搜索和更新功能的系统性能而言,有什么更好的选择,但被用户( SubDocuments )()除以另一个记录为5万条记录的独立模型呢?像这样的东西

代码语言:javascript
运行
复制
var wordsSchema = new Schema({
      word: {type: String},
      progress: {type: Number,default : 0},
      user : {type : Schema.Types.ObjectId, ref :'Users'}
  }]
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-28 13:34:20

还有什么更好:集合中有巨大的子文档数组(大约10000),或者两个与引用分离的集合(其中一个可能包含50000000条记录)?

这里想到的第一件事是:为什么存储引用的成本是存储在子文档中的成本的5000倍?

好的,看看您的模式,我认为最好的方法是单独收集单词,而不是包。

我看到的第一个危险信号是你在这里的双巢:

代码语言:javascript
运行
复制
packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]

在当前版本的words中,MongoDB子文档将很难处理,通常2-3层深度开始出现问题,特别是位置操作符。

现在,考虑到您应该始终从您可以得到的最高值工作:

每个用户可能会有3-10个包含1000个单词的软件包.

你还得考虑一下这份文件的住房成本。您需要的操作符是内存中的操作符,如$pull$push$addToSet等,这意味着您的整个文档需要序列化并加载到MongoDB的原生C++结构中。这将是一个非常昂贵的任务,取决于这些文档的流量。

考虑到你的评论:

我想用word集合做很多读和写操作,更不用说对用户集合的操作了。

它只是在将单词嵌入主用户文档的棺材中又加了一个钉子。考虑到我在上一段中说过的话,这与在words数组上使用内存运算符的成本不太一样。

但我希望有分页,正常的搜索和另一个多汁的mongoDB功能的集合词。

如果将单词拆分,$slice也是内存中的操作符,这将更好地工作,并且可能会导致这里的性能下降。

这是一个快速合理的反应。我相信我可以解释更多关于我的理由,但这应该就足够了。

票数 2
EN

Stack Overflow用户

发布于 2015-09-27 18:23:02

依我看,分开收藏更好

有几件事要记住

  1. 单个文档的最大大小为16 MB。
  2. 不要忘记创建索引(将提高查询性能) http://docs.mongodb.org/manual/core/indexes-introduction/
  3. 如果您使用的是MongoDB 3.0或更高版本,则可以使用有线老虎存储引擎http://docs.mongodb.org/manual/release-notes/3.0-upgrade/

希望它能帮上忙

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

https://stackoverflow.com/questions/32810204

复制
相关文章

相似问题

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