索引、ソート、交差点の公式文書を読んだ後、私はすべてがどのように連携しているかを少し混乱させます。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"})
、同じクエリの作成。しかし、あまりにも多くのキーがスキャンされているようですが、私はクエリ/インデックスのフィールドをより良い順序で見つける必要があるかもしれません。
クエリが並べ替え仕様に先行する、または重複するインデックス接頭辞に等しい条件を指定していない場合、操作は効率的にインデックスを使用せず、インデックスを使用しないこともありますドキュメントを取得する –