MongoDB第一次查询很慢

时间:2013-07-19 19:37:56

标签: mongodb

我已经注意到这个问题有一段时间使用mongo,但还没有找到任何有关它的内部文档,或者如何缓解这个问题。这是对两个完全相同的查询的解释,一个是在另一个之后完成的。

> db.derp.find().explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 8418,
    "nscannedObjects" : 8418,
    "nscanned" : 8418,
    "nscannedObjectsAllPlans" : 8418,
    "nscannedAllPlans" : 8418,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 3,
    "nChunkSkips" : 0,
    "millis" : 3267,
    "indexBounds" : {

    },
    "server" : ...
}

现在第二次运行:

> db.derp.find().explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 8418,
    "nscannedObjects" : 8418,
    "nscanned" : 8418,
    "nscannedObjectsAllPlans" : 8418,
    "nscannedAllPlans" : 8418,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 6,
    "indexBounds" : {

    },
    "server" : ...
}

这是查询速度的一个非常大的差异,从3.2秒到6毫秒。我正在寻找有关此内部缓存的一些信息,如果有任何方法可以调整此缓存(为了保持缓存数据)。

3 个答案:

答案 0 :(得分:3)

查询第一次询问时,页面被加载到驻留内存中。这就是为什么第二个查询在响应时间内几乎不花费的原因

您可以在每次运行查询之前运行server status working set command以检查效果。这应该在“新开始的数据库”当然

上完成

答案 1 :(得分:1)

首先请求从磁盘读取数据 第二个请求来自记忆。

答案 2 :(得分:1)

差异可能是由多种原因造成的。如前所述,第一个查询可能是从磁盘加载的,第二个查询的数据已在RAM中可用。快速测试方法是运行mongostat并在第一次运行之前和之后检查常驻RAM,看看是否增加驻留RAM并显示页面错误。关于http://docs.mongodb.org/manual/reference/program/mongostat/的mongostat的更多信息。 如果要将数据预加载到mongodb,可以使用http://docs.mongodb.org/manual/reference/command/touch/中所述的touch命令。