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 - ロブ。