我已经注意到这个问题有一段时间使用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毫秒。我正在寻找有关此内部缓存的一些信息,如果有任何方法可以调整此缓存(为了保持缓存数据)。
答案 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命令。