索引后Mongodb查询速度变慢
我有一个收藏,比如说db中的水果。其中有以下字段索引后Mongodb查询速度变慢,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个收藏,比如说db中的水果。其中有以下字段 { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock&
{
"_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'});
我的索引包含所有这些键,是否足以满足此要求
为所有这些组合键创建了不同的索引
上面提到过吗
有时我在使用查询,有时我在其他一些集合上使用聚合,查找这些集合,然后执行搜索等
{
"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**
Partially=>索引基本上是MongoDB中B树数据结构的一个添加项,它映射系统中的文档。项上的索引前缀允许索引用于您提到的第一个和第二个查询,但它将是第三个和最后一个查询的集合扫描
在这里阅读
从长远来看,您需要正确理解索引,特别是对于查询,您可以寻求帮助,但知识差距将成为一个问题。简短的阅读会非常有用
编辑
Aggregation=>取决于查询的一部分,大多数情况下仅针对匹配项,此后可以在内存中使用索引(查看更多详细信息)。对于查找,如果在另一个集合上有索引(同样是匹配部分),则可以使用该集合上的索引来获取数据,但在获取该数据之后,对其执行的任何额外操作都将在内存中完成。从逻辑上讲,大部分数据的获取都是在索引将被使用的地方,用于对上面链接的文档进行排序 该索引将部分用于以下方面
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**
Partially=>索引基本上是MongoDB中B树数据结构的一个添加项,它映射系统中的文档。项上的索引前缀允许索引用于您提到的第一个和第二个查询,但它将是第三个和最后一个查询的集合扫描
在这里阅读
从长远来看,您需要正确理解索引,特别是对于查询,您可以寻求帮助,但知识差距将成为一个问题。简短的阅读会非常有用
编辑
Aggregation=>取决于查询的一部分,大多数情况下仅针对匹配项,此后可以在内存中使用索引(查看更多详细信息)。对于查找,如果在另一个集合上有索引(同样是匹配部分),则可以使用该集合上的索引来获取数据,但在获取该数据之后,对其执行的任何额外操作都将在内存中完成。从逻辑上讲,大部分数据的提取都是在索引将被使用的地方,用于排序部分。请阅读上面链接的文档。您能显示解释查询的结果吗?中的解释很好,只需按照文档的说明操作即可。您能显示解释查询的结果吗?中的解释很好,只需按照文档中的说明进行操作。好的,我明白了,如果我们在集合上使用lookup等来运行聚合,那么这个逻辑将是相同的?聚合=>取决于查询的一部分,主要是为了匹配,在内存中发生其他所有事情之后,您可以使用索引。对于查找,如果在索引上有索引,则使用其他集合上的索引获取数据。(MuHADADAADILBANARAS更新了答案,考虑接受这个答案。好,我明白了,如果我们在查找集合上运行聚合,那么这个逻辑是相同的?聚合= =取决于查询的一部分,大多数情况下,只有在匹配时,您才可以使用索引,此后所有其他内容都会发生在内存中。对于查找,如果在索引上有索引,则使用其他集合上的索引获取数据(再次匹配部分)。MuHuMADAADILBANARAS更新了答案,考虑接受这个作为答案。