3

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 に収めることができるはずです。

4

0 に答える 0