我有一個非常簡單的使用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中的整個數據庫。