2016-05-24 10 views
0

私はmongoDb(sails-mongo)でSails.jsを使ってアプリを書いた。Sails.jsで遅いMongoDBクエリ

まず、私は単一の文書にすべてを書くことにした... そして、データベースはデータの5ギガバイトに鈍化... は、「広告掲載を抑制」Iより

..基本的な検索クエリが30-50sで実行されたことを意味し

Markets.js

module.exports = { 
     attributes: { 
     name: { 
      type: 'string', 
      index: true 
     }, 
     pairs: { 
     collection: 'Exchanges', 
     via: 'source', 
     } 
     } 
    }; 

とExchanges.js

..私のモデルの 例を複数のコレクション内のすべてを書き換えるとインデックスを追加db.stats

あなたは私をアドバイスすることができますどのような
> db.stats() 
{ 
    "db" : "stats222", 
    "collections" : 8, 
    "objects" : 36620661, 
    "avgObjSize" : 238.26556139988844, 
    "dataSize" : 8725442352, 
    "storageSize" : 10033258480, 
    "numExtents" : 63, 
    "indexes" : 13, 
    "indexSize" : 2940024192, 
    "fileSize" : 14958985216, 
    "nsSizeMB" : 16, 
    "extentFreeList" : { 
     "num" : 0, 
     "totalSize" : 0 
    }, 
    "dataFileVersion" : { 
     "major" : 4, 
     "minor" : 22 
    }, 
    "ok" : 1 
} 

module.exports = { 

    attributes: { 
    s1: { 
     type: "string" 
    }, 
    source:{ 
     model: "Maklers", 
     index: true 
    }, 
    s2: { 
     type: "string" 
    }, 
    p: { 
     type: 'float' 
    }, 
    v1: { 
     type: 'float' 
    }, 
    v2: { 
     type: 'float' 
    }, 
    vb: { 
     type: 'float' 
    } 
    } 
}; 

とスロークエリの例

Markets.findOne({ 
      name: info, 
      sort: 'createdAt DESC', 
      limit: 1, 
      createdAt: { 
      '<=': aft 
      } 
     }).populateAll().exec(function(err, items) { 
      callback(err, items); 
     }); 

結果? 毎分約2000件のレコードです。

パフォーマンスを向上させるにはどうすればよいですか? データベース設定を変更しますか?インデックスを変更しますか? DBを変更しますか?モデル/コレクションの設定を変更しますか?

私が...悪い英語のため は申し訳ありません..

+0

実際に何をしようとしていますか?これは、クエリの種類を混在させているようです。例えばfindOneメソッドの制限を使用すると何もできません... –

+0

Actualy Limit ..古いクエリの一部です。ここではちょうどFind .. これは削除されました。 –

+0

その一部は、データベースが常駐するサーバー。理想的には、ページフォールトなどが得られないように、データベース全体とインデックスをメモリに保持するのに十分なメモリが必要です。 .populateAll()メソッドが呼び出されます。これは*本当に高価です。特に、最初の.find()ステップから多くのレコードが返された場合は、それはあなたのクエリに余分なクエリと反復の*千*を追加することができます... –

答えて

3

を仮想メモリ2GBのと2コアサーバを使用してのMongoDBを使ってウォーターラインの0.12バージョンでの欠点があります。デフォルトでは、水線は大文字と小文字を区別しません。そして、mongodbは!

文字列を検索するときにREGEXを使用して大文字小文字を検索するため、インデックスが無駄になるため、クエリが遅くなります。

someMongodbServer: { 
    adapter: 'sails-mongo', 
    host: 'mongodb', 
    port: 27017, 
    user: 'username', 
    password: 'password', 
    database: 'databaseCoolName', 
    wlNext: { 
     caseSensitive: true 
    } 
}, 

あなたはMongoDBのログで確認することでこのエラーを確認することができます。しかし、あなたはwlnex属性を持つケースの感性を無効にすることで、それを変更することができます。遅いクエリが何であるかを確認してください。