MongoDB サーバーのプロファイリングと最適化を行っていますが、遅いクエリ (データベース プロファイラーによると 100 ミリ秒以上) の 99% は、node.js コード内の単一のクエリが原因であることがわかりました。
まず、キャッシュをモデル化した方法を次に示します (mongoose を使用):
{
'_id': { type: String, unique: true},
'group': { type: String, index: true },
'post_time_msec': { type: Number, index: true },
'stream_type': { type: String },
'stream_name': { type: String },
'stream_id': { type: String },
'stream_key': { type: String },
'last_updated': { type: Date },
'data': {},
'bookmarks': { type: Number },
}
さて、私のクエリは遅いです。特定の「グループ」フィールドに収まるオブジェクトを探します。つまり、グループ内のすべてのオブジェクトの「post_time_msec」を見つけて、それらのオブジェクトを更新する必要があるかどうかを判断したいということです。
node.js と mongo のクエリは次のようになります。
var thegroup = ... // this is set earlier
model.find({'group': thegroup}, {'_id': true, 'post_time_msec': true}, {'limit': 300, 'sort': {'post_time_msec': -1}});
また、コレクションを頻繁にクリーンアップし、特定のグループに属するコレクションに 300 を超えるオブジェクトがある場合は余分なオブジェクトを削除します (この方法では、クエリが何千ものレコードを検索することはありません...)
mongo プロファイラーを見ると、クエリの実行速度が遅い例を次に示します。
{ "ts" : ISODate("2012-10-03T05:00:29.802Z"), "op" : "query", "ns" : "streamified.postcaches", "query" : { "query" : { "group" : "network/group/2934jq98239oeu1" }, "orderby" : { "post_time_msec" : -1 } }, "ntoreturn" : 300, "nscanned" : 305, "scanAndOrder" : true, "nreturned" : 300, "responseLength" : 31520, "millis" : 985, "client" : "10.179.35.87", "user" : "" }
ご覧のとおり、このクエリが完了するまでに丸 1 秒近くかかりました。305 行のみをスキャンし、2 つのフィールドのみを返し、すべてのクエリ フィールドにインデックスが付けられています。
何か不足していますか?