我有一个非常简单的Mongo Query,我正在使用PHP执行。
我相信查询执行得非常快,因为当我在终端上运行它时,它几乎立即完成,当我解释时()它表明它在1-2ms内执行。
然而,当我去迭代光标并将内容放入数组时,它会减慢大时间,大约需要1秒钟来迭代几条记录。
它使用索引,索引将扫描的对象缩减为它返回的少数文档。
我在这个数据库上运行的其他非常类似的查询完全快了1000倍。
以下是explain()的结果:
cursor (String, 18 characters ) BtreeCursor vsid_1
nscanned (Integer) 7
nscannedObjects (Integer) 7
n (Integer) 7
scanAndOrder (Boolean) TRUE
millis (Integer) 2
nYields (Integer) 0
nChunkSkips (Integer) 0
isMultiKey (Boolean) FALSE
indexOnly (Boolean) FALSE
indexBounds (Array, 1 element)
vsid (Array, 1 element)
0 (Array, 2 elements)
0 (String, 32 characters ) e11d0d96958a473e261933516489158c
1 (String, 32 characters ) e11d0d96958a473e261933516489158c
allPlans (Array, 4 elements)
oldPlan (Array, 2 elements)
正如您所看到的,它正在使用适用于此查询的“vsid”索引。这个集合的大小不小,但也不大(约250,000条记录)。
当我执行查询时,我只是使用一个非常简单的迭代循环它将它放入一个数组中:
foreach ($cursor as $obj) {
$vhit[] = $obj;
}
执行每次迭代的实际时间只有几分之一毫秒。查询的执行最多为2毫秒。但是进入“foreach”循环的过程会导致1秒的延迟。
有什么想法吗?
编辑:服务器运行大约8 GIG的RAM,但整个数据库只有745 MB,所以它应该能够将整个数据库安装在RAM中。