当$ match键不在索引中时,mongodb聚合非常慢(表扫​​描吗?)

时间:2014-07-07 16:19:21

标签: performance mongodb aggregation-framework

db.collection.aggregate(

{  "$match" : {
        "key" : "mykey"

    }
}, 
{
    "$sort" : {
        "time" : -1
    }
},
{
    "$limit" : 1 
}

示例文档:

{
   key: "key1",
   time: ISODate("2014-07-04T20:04:46.904Z")
}

索引

"time" : -1
"key" : 1,
"_id" : 1

当集合中存在“mykey”时,查询需要30ms,当“mykey”不存在时需要10s, 解释告诉我使用了索引。 这是一个有上限的集合,因此通常会发生缺少“密钥”的情况。 为什么需要这么长时间。 顺便说一句。 Mongodb 2.4

进一步探索:

删除排序索引会缩短查找时间:

解释在sort字段上有和没有索引的聚合表明,对于索引,排序在管道开始时执行,没有排序索引它将作为管道的最后一步执行

1 个答案:

答案 0 :(得分:0)

您的查询在key上是相等的,并在time上排序,这意味着您使用了错误的索引(您的索引本质上是time:1, key:1)。

您正在运行的查询的字段顺序应为key:1, time:1(作为前两个字段),以便从中获得有效帮助。使用该索引,可以直接跳转匹配的key值,然后如果time有多个key值,则对它们进行排序,并且可以立即获取最高值。如果在索引中找不到key,那么就完成了。

实际上,查询被强制扫描索引(前导字段)中的所有时间值,这样当您找到第一个匹配的键时,您将能够返回。当您要查找的密钥不存在时,查询最终会扫描整个索引,然后才能返回。