83

最近、メイン コレクションの 1 つで 200 万件を超える記録を達成しましたが、そのコレクションで重大なパフォーマンスの問題が発生し始めました。

コレクション内のドキュメントには、UI を使用してフィルター処理できる約 8 つのフィールドがあり、結果は、レコードが処理されたタイムスタンプ フィールドによって並べ替えられることになっています。

フィルタリングされたフィールドとタイムスタンプを使用して、いくつかの複合インデックスを追加しました。

db.events.ensureIndex({somefield: 1, timestamp:-1})

また、複数のフィルターを一度に使用してパフォーマンスを向上させるためのインデックスをいくつか追加しました。ただし、一部のフィルターは実行に非常に長い時間がかかります。

クエリが作成したインデックスを使用することを説明することを確認しましたが、パフォーマンスはまだ十分ではありません。

シャーディングが現在の方法であるかどうか疑問に思っていました..しかし、すぐにそのコレクションで 1 日あたり約 100 万の新しいレコードを取得し始める..だから、それがうまくスケーリングするかどうかはわかりません..

編集: クエリの例:

> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['nickey@acme.com']}}).sort({timestamp: -1}).limit(25).explain()
{
        "cursor" : "BtreeCursor user.userName_1_timestamp_-1",
        "isMultiKey" : false,
        "n" : 0,
        "nscannedObjects" : 30060,
        "nscanned" : 30060,
        "nscannedObjectsAllPlans" : 120241,
        "nscannedAllPlans" : 120241,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 1,
        "nChunkSkips" : 0,
        "millis" : 26495,
        "indexBounds" : {
                "user.userName" : [
                        [
                                "nickey@acme.com",
                                "nickey@acme.com"
                        ]
                ],
                "timestamp" : [
                        [
                                {
                                        "$maxElement" : 1
                                },
                                {
                                        "$minElement" : 1
                                }
                        ]
                ]
        },
        "server" : "yarin:27017"
}

私のコレクションには deviceType の値が 2 つしかないことに注意してください。

4

3 に答える 3

3

Mongo はクエリごとに 1 つのインデックスのみを使用します。したがって、2 つのフィールドをフィルター処理する場合、mongo はいずれかのフィールドでインデックスを使用しますが、サブセット全体をスキャンする必要があります。

これは、最高のパフォーマンスを達成するために、基本的にすべてのタイプのクエリにインデックスが必要であることを意味します。

データによっては、フィールドごとに 1 つのクエリを作成し、アプリで結果を処理することも悪くない場合があります。この方法では、すべてのフィールドのインデックスのみが必要になりますが、データが多すぎて処理できない場合があります。

于 2013-10-24T08:45:30.290 に答える
-2

$in を使用している場合、mongodb は INDEX を使用しません。この $in を削除して、クエリを変更します。インデックスを使用する必要があり、以前に取得したものよりもパフォーマンスが向上します。

http://docs.mongodb.org/manual/core/query-optimization/

于 2014-10-16T10:14:18.833 に答える