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



我正在构建一个应用程序,我有一个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通过a集合时,如果我正在寻找这样的东西:

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

它并没有遍历所有的记录。因此,如果我在销售结束时取消设置"sale",只保留当前正在销售的记录中的字段,那么性能应该不会太差。

我的问题是:我错过了什么吗?有更好的方法吗?

MongoDB的工作方式,以及许多其他数据库,是你需要一个索引字段,你想以合理的性能查询。数据库中的索引保存在内存中,这意味着对索引字段的查询不需要对硬盘驱动器进行扫描,而是在内存中以有效的遍历数据结构进行扫描,从而产生更好的性能。还有很多其他的细节,我不需要进入,谷歌会解释得很好。

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

您必须找到服务器可以容纳多少索引的最佳位置,并权衡不像其他集合那样经常访问的集合的索引。索引越多,mongod守护进程消耗的内存就越多。

相关内容

  • 没有找到相关文章

最新更新