假设我有一个MongoDB文档集合,只有两个字段--x和y - 其中一个(比如x)有一个索引。
以下任何一种查询是否会比另一种查询具有更好的性能?
单一匹配查询:
db.collection.aggregate({$match : {x : "value", y : "value"}})
双匹配查询(首先匹配索引字段):
db.collection.aggregate({$match : {x : "value"}}, {$match : {y : "value"}})
答案 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中已经改变,因此多次调用只会导致服务器上的一次调用。这实际上有点令人失望,因为它使得一些查询需要更难的第二个非索引部分:\
。