PHPを使用して実行している非常に単純なMongo Queryがあります。
端末で実行するとほぼ瞬時に完了し、explain() を実行すると 1 ~ 2 ミリ秒で実行されていることが示されるため、クエリは非常に高速に実行されていると思います。
ただし、カーソルを反復処理してコンテンツを配列に入れると、速度が遅くなり、ほんの数レコードを反復処理するのに約 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 に収めることができるはずです。