【问题标题】:Mongodb query getting slow even after indexing即使在索引之后,MongoDB 查询也会变慢
【发布时间】:2021-06-01 07:16:53
【问题描述】:

我有一个集合,比如说 db 中的 Fruits。其中有以下字段

{
 "_id": ObjectId(...),
 "item": "Banana",
 "category": ["food", "produce", "grocery"],
 "location": "4th Street Store",
 "stock": 4,
 "type": "cases"
}

_id默认有一个索引,我添加了另一个索引,

{
 "item": "1",
 "category": "1",
 "stock": "1",
 "type": "1"
}

这个集合有数千个数据,我的查询响应很慢。我的查询是。

在我上面提到的索引之后,我需要添加所有这些吗 检查我的查询,或者我可以在索引中添加的键上使用任何?

就像,目前我的查询是这样的

fruits.find({item: 'new'});
fruits.find({item: 'new', category: 'history'});
fruits.find({stock: '5', category: 'drama'});
fruits.find({type: 'new'});

包含所有这些键的索引是否足够,或者我需要 为所有这些键组合创建了不同的索引,我 上面提到的?

有时我使用查询,有时我在其他一些集合上使用聚合并查找此水果集合,然后进行搜索等。

【问题讨论】:

  • 你能显示解释查询的结果吗?
  • mongodb compound index docs 中很好的解释,只需按照文档中的说明进行操作即可。

标签: mongodb aggregation-framework


【解决方案1】:
{
 "item": "1",
 "category": "1",
 "stock": "1",
 "type": "1"
}

此索引将部分适用于以下情况。

fruits.find({item: 'new'}); **Will work (Partially)**
fruits.find({item: 'new', category: 'history'}); **Will work (Partially)**
fruits.find({stock: '5', category: 'drama'}); **Won't work**
fruits.find({type: 'new'}); **Won't work**

部分 => 索引基本上是 MongoDB 中 B-Tree 数据结构中的一个添加,它映射系统中的文档。 item 上的索引前缀允许索引适用于您提到的第一个和第二个查询,但它将是对第三个和最后一个查询的集合扫描。

在此处了解prefixes

从长远来看,您需要正确理解索引,对于具体的查询,您可以寻求帮助,但知识差距将成为问题。 This简要阅读将非常有用。

编辑

聚合 => 取决于查询的一部分,主要是为了匹配,您可以使用索引,然后其他一切都发生在内存中(查看this 了解更多详细信息)。对于查找,如果您有索引(同样是匹配部分),则使用其他集合上的索引来获取数据,但是在获取该数据之后,无论您对它做什么额外的操作都将在内存中完成。从逻辑上讲,大多数数据的获取将是无论如何都会使用索引的地方,对于排序部分,请阅读上面链接的文档。

【讨论】:

  • 好的,我明白了,如果我们在集合上运行聚合查找等,这个逻辑会是一样的吗?
  • Aggregation => 取决于查询的一部分,主要是为了匹配,你可以使用索引,然后其他一切都发生在内存中。对于查找,如果您有索引,则使用其他集合上的索引获取数据(再次匹配部分。)
  • @MuhammadAadilBanaras 更新了答案,考虑接受这个作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2013-04-20
相关资源
最近更新 更多