2016-11-02 15 views
1

索引、ソート、交差点の公式文書を読んだ後、私はすべてがどのように連携しているかを少し混乱させます。MongoDB:索引、ソート

作成したインデックスをクエリに使用する際に問題が発生しました。私はmongodb 3.0.3で、約4百万のドキュメントを持っているコレクションを扱っています。のは、私の文書は、6つのフィールドで構成されているとしましょう、簡単にするために

{ 
    a:<text>, 
    b:<boolean>, 
    c:<text>, 
    d:<boolean>, 
    e:<date>, 
    f:<date> 
} 

私が達成したい問合せは、以下の通りである。だから、直感的に、私が作成した

db.mycoll.find({ a:"OK", b:true, c:"ProviderA", d:true, e:{ $gte:ISODate("2016-10-28T12:00:01Z"),$lt:ISODate("2016-10-28T12:00:02") } }).sort({f:1}); 

2つのインデックス

db.mycoll.createIndex({a: 1, b: 1, c: 1, d:1, e:1 }, {background: true,name: "test1"}) 
db.mycoll.createIndex({f:1}, {background: true,name: "test2"}) 

しかし、explain()では、最初のインデックスはまったく使用されていません。 (eフィールドの)フィルタに範囲があるときに何らかの制限があることがわかっていましたが、私はその周りに自分の道を見つけることができません。

また、fに単一のインデックスを持つ代わりに、{e:1、f:1}に複合インデックスを試してみましたが、何も変更されませんでした。

だから私は誤解していますか? ご協力いただきありがとうございます。

更新:も私はいくつかの時間を見つけるのMongoDB 2.6の次の述語:

ソートとクエリの親指の良いルールは、この順にインデックス付けフィールドを注文することです

  • 最初に、正確な値を問い合わせるフィールドです。

  • 第2に、あなたが並べ替えるフィールド。

  • 最後に、あなたが値の範囲を照会した上で、フィールド(複数可)(例えば、$ GT、$ LT、$で)

親指のこのルールを使用する例下記の「値の範囲に対する複雑なクエリの結果のソート」のセクションにあります。

これは3.Xバージョンにも当てはまりますか?

アップデート2:インデックスが実際に使用されている

db.mycoll.find({ a:"OK", b:true, c:"ProviderA", d:true, e:{ $gte:ISODate("2016-10-28T12:00:01Z"),$lt:ISODate("2016-10-28T12:00:02") } }).sort({f:1}); 

:述語の上、以下の、私は次のインデックス

db.mycoll.createIndex({a: 1, b: 1, c: 1, d:1 , f:1, e:1}, {background: true,name: "test1"}) 

、同じクエリの作成。しかし、あまりにも多くのキーがスキャンされているようですが、私はクエリ/インデックスのフィールドをより良い順序で見つける必要があるかもしれません。

+0

クエリが並べ替え仕様に先行する、または重複するインデックス接頭辞に等しい条件を指定していない場合、操作は効率的にインデックスを使用せず、インデックスを使用しないこともありますドキュメントを取得する –

答えて

1

索引選択時にMongoが少し奇妙に動作することがあります。

Mongoは、使用するインデックスを自動的に決定します。インデックスが小さいほど、そのインデックスが使用される可能性が高くなります(特に1つのフィールドのみのインデックス) - これは私の経験です。これはRAMに既に読み込まれていることが多いために起こりますか? Mongoがアイドル時にテストクエリを実行するときに使用するインデックスを調べる。しかし、その結果は予期しないこともあります。

したがって、使用するインデックスがわかっている場合は、$hintオプションを使用して特定のインデックスを使用するクエリを強制できます。それを試してみてください。

+0

私は '$ hint'演算子を使うことができますが、これを使うのを避けることができれば、その方が良いでしょう。 – Tarteens

1

あなたの2つのインデックスは、クエリで使用され、ソートがそうMongoDBのcan not use them for index intersection重ならない:sort()操作は、クエリ述語とは完全に別のインデックスを必要とするとき

インデックスの交差点は適用されません。

+0

のようなインデックスを作成した方が良いでしょうか? 'db.mycoll.createIndex({e:1、f:1}、{background:true、name:" test3 "})' – Tarteens