我有一个非常简单的使用PHP执行的Mongo Query。
我相信查询执行得非常快,因为当我在终端上运行它时,它几乎可以立即完成,并且当我解释()时,它表明它正在1-2ms内执行。
但是,当我去迭代游标并将内容放入数组时,它会减慢bigtime大约需要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中的整个数据库。