MongoDB聚合:具有索引和非索引字段的查询的性能

时间:2013-12-10 14:15:03

标签: mongodb performance indexing aggregation-framework

假设我有一个MongoDB文档集合,只有两个字段--x和y - 其中一个(比如x)有一个索引。

以下任何一种查询是否会比另一种查询具有更好的性能?

单一匹配查询:

db.collection.aggregate({$match : {x : "value", y : "value"}})

双匹配查询(首先匹配索引字段):

db.collection.aggregate({$match : {x : "value"}}, {$match : {y : "value"}})

2 个答案:

答案 0 :(得分:2)

  

以下任何查询都会有比以下更好的性能   另一个?

简而言之:不。性能将或多或少相同,至少就两者都使用相同的索引而言。

  

db.collection.aggregate({$ match:{x:“value”,y:“value”}})

这将使用{x:1}上的索引,就像x和y上的常规find()使用它一样。

  

双匹配查询(首先匹配索引字段):   db.collection.aggregate({$ match:{x:“value”}},{$ match:{y:“value”}})

第一个$match将使用x上的索引,就像查找一样。

在第一种情况下,索引用于减少结果文档集以检查匹配的y值。在第二种情况下,索引用于仅通过管道传递匹配x的文档,因此第二个状态必须在内存中检查它们是否与y匹配。

这两种情况下的效率基本相同。

答案 1 :(得分:0)

单一匹配将具有更好的性能,因为它可以使用单个索引。

双重匹配实际上被视为$match中的$match$match,因为这样的索引实际上不会用于第二个$match。< / p>

然而,这种行为在2.5.4:https://jira.mongodb.org/browse/SERVER-11184中已经改变,因此多次调用只会导致服务器上的一次调用。这实际上有点令人失望,因为它使得一些查询需要更难的第二个非索引部分:\