Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 当$match键不在索引中时,mongodb聚合非常慢(tablescan吗?)_Performance_Mongodb_Aggregation Framework - Fatal编程技术网

Performance 当$match键不在索引中时,mongodb聚合非常慢(tablescan吗?)

Performance 当$match键不在索引中时,mongodb聚合非常慢(tablescan吗?),performance,mongodb,aggregation-framework,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") } 当集合中存在“mykey”时,查询需要30秒,当“m

)

示例文件:

db.collection.aggregate(

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

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

{
   key: "key1",
   time: ISODate("2014-07-04T20:04:46.904Z")
}
当集合中存在“mykey”时,查询需要30秒,当“mykey”不存在时,查询需要10秒, 解释告诉我使用了索引。 这是一个有上限的集合,因此通常会出现缺少“键”的情况。 为什么要花那么长时间。 顺便说一句,Mongodb 2.4

进一步探索:

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


解释排序字段上有索引和无索引的聚合显示,有索引的排序在管道开始时执行,没有索引的排序作为管道的最后一步执行

您的查询在
键上是相等的,在
时间上是相等的,这意味着您为此使用了错误的索引(您的索引本质上是在
time:1,key:1
上)

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


实际上,查询被迫扫描索引(前导字段)中的所有时间值这样,当您找到第一个匹配的键时,您就可以返回。当您要查找的键不存在时,查询在返回之前会扫描整个索引。

您有什么问题吗?为什么在缺少键时需要这么长时间。您所说的“存在”是什么意思?该键的值是否存在,或者该字段是否存在于架构中?当“键”的值不存在时。我正在扫描大型(>2000万个文档)中的ObjectID日志收集,如果有帮助的话。如果您将架构与创建的任何索引和示例文档一起共享,那么完成此任务会更容易。因此,基本上我需要使用1个多键索引,其中所有匹配和排序参数的顺序都正确。我对这些字段使用了单独的索引。但多键ideed做到了这一点“多键”索引是数组上的一个索引。如果你想使用“复合”索引,这是你已经在使用的索引,你只是把它按错误的顺序排列了。
"time" : -1
"key" : 1,
"_id" : 1