「time」フィールドに従って建物のインデックスを使用して、システムログをmongodbに保存します。現在、mongodbには約19万のログがあります。JavaでDBCollection.find()メソッドを使用してすべてのログを取得しようとすると、コレクション内のすべてのドキュメントをトラバースするのに約10秒かかります。見逃してしまったことがパフォーマンスの低下の原因になっているのではないかと思います。
これが私が使用したコードです:
mongo = new Mongo();
DB db = mongo.getDB("Log");
DBCollection coll = db.getCollection("SystemLog");
int count = 0;
long findStart = Calendar.getInstance().getTimeInMillis();
// Sort by time.
BasicDBObject queryObj = new BasicDBObject();
queryObj.put("time", -1);
DBCursor cursor = coll.find().sort(queryObj);
while(cursor.hasNext()) {
DBObject obj = cursor.next();
// Do something
++count;
}
long findEnd = Calendar.getInstance().getTimeInMillis();
System.out.println("Time for traversing all system logs (" + count + "):\t" + (findEnd-findStart) + "ms.");
そして、印刷された結果は次のとおりです。
Time for traversing all system log (194309): 10496ms.
何度か試しました。1回実行しても複数回実行しても違いはないようです。私もsort()を削除して、mongodbからすべてのログアウトを見つけようとしましたが。すべてのドキュメントをトラバースするのに約6秒かかります。時間はまだ私の要件には受け入れられないようなものです。トラバース作業をスピードアップできる実装のヒントはありますか?
どうもありがとう。