如果我查询包含它的文档,取消设置字段是否会提高性能?

时间:2016-10-05 00:26:34

标签: mongodb

我正在构建一个应用程序,我有一个包含500多种产品的标准集合。该公司不断进行销售,因此在任何一个点上,将有2-10种产品在售。

我仍然试图围绕如何在Mongo中建模,但我正试图在“模型将如何访问数据”的风格中思考。由于产品页面的访问频率高于其他任何内容,我正在考虑将销售信息直接添加到产品系列中。像这样:

{
    _id: 1, 
    name: "Widget", 
    price: 15.99, 
    ...
    sale: {
        reducedPrice: 9.99
        saleStarts: "Nov 11, 2016", 
        saleEnds: "Nov 18, 2016", 
    }
}

我有一个页面,其中列出了所有当前销售。它不经常访问,但它需要存在。我的问题是关于该查询中的性能,因为我不想在每次加载该页面时浏览每个产品,并且我试图避免通过第二个Sales集合来复制信息。

据我了解,当Mongo通过收藏品时,如果我正在寻找这样的东西:

Products.find({ sale: { $exists: true } })

它并没有真正涵盖所有记录。因此,如果我在销售结束时取消“销售”并将该字段保留在当前正在销售的记录中,那么表现应该不会太糟糕。

我的问题是:我在这里遗漏了什么吗?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

MongoDB和许多其他数据库的工作方式是,您需要在要以合理性能查询的字段上使用索引。数据库中的索引保存在内存中,这意味着针对索引字段的查询不需要扫描硬盘驱动器,而是在内存中以高效到遍历的数据结构进行扫描,从而获得更好的性能。还有许多其他细节,我不需要进入,谷歌将很好地解释。

您可以阅读有关indexes on MongoDB's docs的更多信息,但要真正回答您的问题;如果您的集合中的sale字段没有索引,MongoDB将被强制从磁盘扫描该集合中的所有文档(尽管有些文件可以缓存在内存中)。

您必须找到服务器可以容纳多少索引的最佳位置,以及不像其他集合那样经常访问的集合的权衡索引。您拥有的索引越多,mongod守护程序将占用的RAM就越多。