mongodb:使用几个单个索引或复合索引



我是MongoDB的初学者。我正在使用3.2版。我在几个地方阅读了MongoDB可以在查询中只使用一个索引,但是我发现的信息似乎有点过时了,我在官方文档中找不到东西。

我有以下形式的〜500m产品的集合:

{_id: ObjectId('574d92332a2b10d7618b4575'), title: A, category_id: ObjectId('574d92332a2b10d7618b4575'), price: 30.23, rating:5 },
{_id: ObjectId('574d92332a2b10d7618b4575'), title: B, category_id: ObjectId('574d92332a2b10d7618b4575'), price: 20.23, rating:3 },
{_id: ObjectId('574d92332a2b10d7618b4575'), title: C, category_id: ObjectId('574d92332a2b10d7618b4575'), price: 10.23, rating:4 }

我需要每个类别找到所有产品,然后按评级进行排序,然后按价格进行排序,但是最终用户也可能想直接按价格进行排序。

每个查询都需要通过类别_id,这是强制性的。

我创建了3个索引:{category_id:1}{rating:1}{price:1}

这些查询很快:

每类最昂贵的产品 db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({price:-1})

每类最好的产品 db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({rating:-1})

每类最坏的产品 db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({rating:1})

但是此查询非常慢

每类最好的产品,然后最便宜 db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({rating:-1, price:1})

如果您是我,您会创建哪些索引,为什么?我开始认为仅拥有pricerating是愚蠢的,因为每个查询都需要category_id,因此也许我的索引应该包括category_id,但是让我感到困惑的是官方文档有关复合索引的最后一段。

我已经在MongoDB的官方页面上阅读了整个部分,但我找不到解决我的特定问题的答案。

您应该创建复合索引以满足您的查询,在大多数情况下,它们应该包括您的查询术语和排序标准。

我相信您所指的令人困惑的段落是关于何时有多种标准,例如复合排序。当您具有复合排序时,索引条目的顺序和方向都至关重要。如果您仅按单个值进行排序,则索引(1或-1,上升或下降)的方向无关紧要。

有关更多详细信息和示例,请参阅此问题。另一个不错的资源是优化复合索引博客文章。

您可能需要考虑如果您真的需要允许这种化合物排序,例如,从大多数电子商务网站中,您只能按评级或价格进行排序,但不能同时进行排序。

使用复合索引,除非有一个或条件并使用.explain('executionStats&quort; quort; quot; quot&quort'否则Mongo在查询执行时仅考虑一个索引

db.collection.find({your query}).explain("executionStats")

如果执行上述查询,则可以找到" QueryPlanner"。结果中具有获胜计划的细节(索引最终考虑)和拒绝了平面物(所有最初被认为但不够赢得一个索引)的对象(索引)

最新更新