3

「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秒かかります。時間はまだ私の要件には受け入れられないようなものです。トラバース作業をスピードアップできる実装のヒントはありますか?

どうもありがとう。

4

1 に答える 1

1

本当にすべてのドキュメントをトラバースする必要がありますか?上記のコードでは、各オブジェクトを1つずつメモリに取り込むように見えます。

  1. 'time'フィールドのインデックスは、そのようにソートしているため、'descending'として作成する必要があります。
  2. インデックスが複合である場合(「time」だけでなく、インデックスにさらに多くのフィールドがある)、「time」だけでインデックスも追加するようにしてください。また、そのクエリにフィルタを追加するときは、「時間」フィールドがインデックスの最後に追加され、降順であることを確認してください。
  3. 19万個のオブジェクトを1つずつ読み取っていることを考えると、パフォーマンスはそれほど悪くありません。

(mongodbでの私の経験には、Javaドライバーの操作は含まれないことに注意してください)

于 2012-11-06T10:32:15.833 に答える