11

了解しました。Node.jsをベースにしたアプリケーションを構築しており、mongodbへの接続を処理するためにmongooseを使用しています。私はそのようなエンドポイントを持っています:

getTestStream : function(req, res, conditions, callback) {   
  Activity.find()
    .limit(1000)
    .run(function(err, activities) {
      if (err){
        util.sendError(req, res, "Query Error", err);
      } else if (activities) {     
        res.send(activities);
      } else {
        util.send('nope');
      }
  });
}

何らかの理由で、この呼び出しは完了するのに700ms以上かかります。mongodbシェルからの制限を適用せずに同じ呼び出しを行うと、約4ミリ秒で戻ります。とても単純なクエリのように思えますが、何がそれほど遅くなっているのでしょうか。どこかで明らかな設定を見逃していると思いますが、わかりません。

これを手伝ってくれる人に感謝します。

他の情報:

mongoose@2.6.0
mongodb@2.0.4
node@0.6.9
4

3 に答える 3

9

しばらく実験した後、私は速度低下へのいくつかの貢献を見つけました、うまくいけば、これは同様の問題を持つ人を助けるでしょう:

  • リクエストしているオブジェクトは大きいので、処理に時間がかかります。大きなオブジェクトの場合は、現在必要なフィールドのみを返すようにクエリを変更します。
  • Mongooseは便利ですが、多くのアイテムをリクエストすると実際に速度が低下する可能性があります。通話の速度が必要な場合は、node-mongodb-nativeと直接インターフェースする方がよいでしょう。(これは私のシナリオでは約50%以上の速度向上でした)

これらの手法を使用すると、以前の1000を処理していたよりも短い時間で4000のレコードを処理できるようになりました。コメントしてくれた人に感謝します。また、マングースはこの種の電話にはあまり適していないことを指摘してくれたGatesVPに特に感謝します。

于 2012-05-04T00:14:39.627 に答える
0

mongodbシェルからの制限を適用せずに同じ呼び出しを行うと、約4ミリ秒で戻ります。

シェルはデフォルトで30程度の制限を適用します。実際の制限でシェルからやってみませんか?

また、.explain()シェルから試してみることもできます。

それでもうまくいかない場合は、@ Kyle Bankerの提案を参考にして、プロファイラーを確認してください。

于 2012-05-03T00:27:41.683 に答える
-1

checkoutensureIndexこれ により検索が高速化されます

于 2013-04-20T06:32:33.063 に答える