1

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

> 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 毫秒。我正在寻找有关这里正在进行的内部缓存的一些信息,以及是否有任何方法可以调整此缓存(为了保持缓存数据)。

4

3 回答 3

3

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

您可以在每次运行查询之前运行server status working set 命令来检查效果。当然,这应该在“新启动的数据库”上完成

于 2013-07-19T19:45:01.140 回答
1

第一个请求从磁盘读取数据第二个请求来自内存。

于 2013-07-19T19:42:55.867 回答
1

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

于 2013-07-19T20:53:44.863 回答