balooにもう少し追加しすぎます の答え。
タイムスタンプと長い問題について。通常、MongoDBサーバーには違いはありません。 BSONエンコーディングの長さは同じです(64ビット)。ドライバーのエンコードによっては、クライアント側でパフォーマンスが異なる場合があります。例として、Java側では、10genドライバーを使用してタイムスタンプがDate
としてレンダリングされます。 これはLong
よりもはるかに重いです 。 ドライバー
があります そのオーバーヘッドを回避しようとします。
もう1つの問題は、インデックスの最初のフィールドの範囲を閉じると、パフォーマンスが向上することです。したがって、 balooによって提案されたインデックスを使用する場合 :
db.collection.ensureIndex({start: 1, final: 1})
クエリが次の場合、クエリのパフォーマンスは(潜在的にはるかに)向上します:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)},
final:{$lt:DateTime(...)}})
概念的には、インデックスをツリーと考えると、閉じた範囲はツリーの片側だけでなく両側を制限します。クローズドレンジがない場合、サーバーはstart
ですべてのエントリを「チェック」する必要があります start
間の関係がわからないため、提供されたタイムスタンプよりも大きい およびfinal
。
次のような単一のフィールドインデックスを使用すると、クエリのパフォーマンスが向上しない場合もあります。
db.collection.ensureIndex({start: 1})
節約のほとんどは、最初のフィールドの剪定によるものです。これが当てはまらないのは、クエリがインデックスでカバーされている場合、または結果の順序付け/並べ替えをインデックスから取得できる場合です。
HTH-ロブ。