3

我有一个非常简单的 Mongo Query,我正在使用 PHP 执行它。

我相信查询执行得非常快,因为当我在终端上运行它时,它几乎立即完成,当我执行 explain() 时,它显示它在 1-2 毫秒内执行。

但是,当我去迭代光标并将内容放入一个数组时,它会减慢 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 中容纳整个数据库。

4

0 回答 0