15

完了するのに時間がかかりすぎるクエリがあります。私はいくつかのパフォーマンス テストを行うのが好きですが、一度チェックした後 (現在は約 30 秒かかります)、クエリの実行速度が大幅に向上します (< 1 秒)。私はそれがmongodbキャッシングである必要があると思います。mongodb のキャッシュを無効にする方法や、パフォーマンスを確認できる別の方法はありますか?

私はmongohqでホストされているmongodbを使用しています。Ruby on Rails 3 でプログラミングします。説明は次のとおりです。

{"cursor"=>"BtreeCursor start_-1", "nscanned"=>5276, "nscannedObjects"=>5276, "n"=>25, "millis"=>3264, "nYields"=>0, "nChunkSkips"=>0, "isMultiKey"=>false, "indexOnly"=>false, "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}, "allPlans"=>[{"cursor"=>"BtreeCursor attendees_count_-1", "indexBounds"=>{"attendees_count"=>[[1.7976931348623157e+308, 1]]}}, {"cursor"=>"BtreeCursor images_count_-1", "indexBounds"=>{"images_count"=>[[1.7976931348623157e+308, 2]]}}, {"cursor"=>"BtreeCursor start_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor start_-1_end_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]], "end"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor attendees._id_1 multi", "indexBounds"=>{"attendees._id"=>[[BSON::ObjectId('4f0b621e94bb688563000007'),BSON::ObjectId('4f0b621e94bb688563000007')], [BSON::ObjectId('4f0b647d5a8c00acde05236f'), BSON::ObjectId('4f0b647d5a8c00acde05236f')], [BSON::ObjectId('4f0b647d5a8c00acde052370'), BSON::ObjectId('4f0b647d5a8c00acde052370')], [BSON::ObjectId('4f0b647d5a8c00acde052371'), BSON::ObjectId('4f0b647d5a8c00acde052371')], [BSON::ObjectId('4f0b647d5a8c00acde052372'), BSON::ObjectId('4f0b647d5a8c00acde052372')], [BSON::ObjectId('4f0b647d5a8c00acde052373') ... (lots of Object IDs)]]}}}

説明が長すぎるため、説明の一部を切り捨てなければならなかったことに注意してください。「たくさんのオブジェクト ID」があるところには、たくさんのオブジェクト ID (~400) がありました。

皆さんありがとう

4

3 に答える 3

7

Mongo がクエリ プランを準備するのを止めることはできないと思います (これが mongo のしくみです)。したがって、クエリ統計の前に.. 1. すべてのコレクションのプラン キャッシュを次のようにクリアします。

>db.colllction_name.getPlanCache().clear()
  1. プロファイラーで遅いクエリを記録します(mongo docs を参照)。
  2. クエリを最適化するために作業し、
  3. キャッシュを再度クリアし、クエリのパフォーマンスを再度確認してください。
于 2018-08-28T09:07:34.060 に答える
5

クエリを初めて実行するとき、データ セットはメモリ マップされますが、実際のメモリにはページングされません。MongoDB サイトのキャッシュを参照してください。そのため、OS はそのデータ セットをメモリにページングする必要があり、クエリを実行して結果を取得します。

ディスク (低速) から RAM (高速) にページインしているため、最初の実行は低速であり、その後、メモリ プレッシャーがない限り、そのデータは RAM に保持され、そのデータ セットに対する後続のすべてのクエリは高速になります。 .

これがMongoDBが機能するように設計されている方法です。データセットをメモリにロードするプロセスは、データベースの「ウォームアップ」と呼ばれることが多く、そのウォームアップ(この場合は最初のクエリ)の後にのみ真のパフォーマンスが得られます。

最初のクエリが返されるまでに非常に長い時間がかかるように見えることに注意してください。インデックスが効果的に使用されていることを確認する必要があります。その調査を開始するのに最適な場所は、explain()ページです。

于 2012-02-20T15:08:21.480 に答える