gpt4 book ai didi

MongoDB:使用多个单一索引或复合索引

转载 作者:搜寻专家 更新时间:2023-10-30 23:38:44 34 4
gpt4 key购买 nike

我是 MongoDB 的初学者。我正在使用 3.2 版。我在几个地方读到 MongoDB 只能在查询中使用一个索引,但我找到的信息似乎有点过时,而且我在官方文档中找不到任何信息。

我收集了大约 5 亿个具有这种形式的产品:

{_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 }

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

每个查询都需要传递 category_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,但是 what confuses me is the last paragraph of the official doc about compound indexes .

我已经read this whole section on the official page of MongoDB但我找不到我的具体问题的答案。

最佳答案

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

我认为您提到的令人困惑的段落是关于何时有多个排序标准,例如复合排序。当您使用复合排序时,索引条目的顺序和方向都很重要。如果您仅按单个值排序,则索引的方向(1 或 -1,升序或降序)无关紧要。

参见 this SO question有关更多详细信息和示例。另一个很好的资源是这个 Optimizing Compound Indexes博文。

您可能需要考虑是否真的需要允许这样的复合排序,对于您的示例,大多数电子商务网站似乎更常见,您只会按评级或价格排序,但不会同时按两者排序。

关于MongoDB:使用多个单一索引或复合索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37890862/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com