sql >> データベース >  >> NoSQL >> MongoDB

さまざまなフィールドを持つ範囲クエリのmongodbインデックス戦略

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



    1. mongodbの配列オブジェクト値から合計する必要があります

    2. 配列の最初の要素を取得し、Aggregateを使用して戻りますか?

    3. Mongodbを3.2から3.6にアップグレード中にエラーが発生しました

    4. Mongoでは、コレクションのすべてのアイテムをより大きな配列とどのように照合しますか?