2017-08-16 11 views
3

MongoDBでWebアプリケーションを開発しています。私は、同じクエリを繰り返し実行すると、処理速度が向上し、最終的に特定のポイントに収束するという現象に気付きました。コレクション内のすべてのドキュメントを照会するときと同様に、クエリごとの使用時間は100000 ms - > 20000 ms - > 9000 ms - > ... - 500 msになります。繰り返しクエリを処理するとMongoDBが高速になります

私はスピードブーストの背後にある理由は何ですか?どのように収束点を推定するのですか?

+1

おそらくすべてのドキュメントがその時点でメモリに入っているので、ディスクをもう一度ヒットする必要はありません。 – JohnnyHK

+0

ありがとう、ジョニー。私はこのようなキャッシュのようなメカニズムを考えましたが、ドキュメントがキャッシュに入ったら一番良いパフォーマンスを向上させることはできませんか?しかし、私の所見によると徐々に改善されているので、少なくとも各クエリの後にすべてのドキュメントがキャッシュに保存されるわけではありません。 –

答えて

2

多くの理由がありますが、私はいくつかの点を挙げることができます。

まず、MongoDBはクエリに最適なインデックスを選択することができます。そのために、MongoDBはクエリプランを使用します。一致するエントリがない場合

は、問い合わせプランナは、試用期間中の評価のための 候補計画を生成します。しかし、この操作は時間がかかります。クエリプランナ は、勝利プランを選択し、勝利 プランを含むキャッシュエントリを作成し、これを使用して結果ドキュメントを生成します。

https://docs.mongodb.com/manual/core/query-plans/

INDEXは、これも時間がかかり、パフォーマンスをスピードアップするために、メモリにロードする必要があります。タッチを見てみてください:メモリへのデータ記憶層から

https://docs.mongodb.com/manual/reference/command/touch/

touchコマンドデータをロードします。 touchは、データ(つまりドキュメント)インデックス、または両方のドキュメントと インデックスをロードできます。

もう一つの理由、INDEXはこれはあなたのケースであれば、多分あなたはtotalIndexSize

https://docs.mongodb.com/manual/reference/method/db.collection.totalIndexSize/#db.collection.totalIndexSize

に確認することができます知っているために、メモリに収まらない私が改善するより焦点を絞りましたよMongoDBは常にあなたのために最善の決定を下すことができないので、クエリプランナー側ではありません。

パフォーマンスの低下を避けるため、このトピックはすべて慎重に評価する必要があります。

Good Luck!

+0

あなたの洞察に感謝します!私はこれらを詳細に学びます。 –

関連する問題