最近、メイン コレクションの 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 つしかないことに注意してください。