2011-11-02 1 views
7

MongoDBでは、複合インデックスを使用するクエリでは、インデックス内のすべてのキー、または少なくとも一部のキーを使用する必要があることを理解しています左から開始します。たとえば、クエリでless than allを使用するMongo複合インデックス

db.products.find({ "a":"foo", "b":"bar" }) 

{a、b、c}で構成されるインデックスをうまく利用できます。

私が照会したい場合は、:

db.products.find({"a":"foo", "c":"thing" }) 

を、私は、このインデックスを使用することはできませんと信じています。これは "b"に簡単な条件を加えることで解決できますか?

db.products.find({"a":"foo", "b":{ $ne : "" }, "c":"thing" }) 

実際にはbの値は気にしません。これは、現在45Mのオブジェクトがあり、インデックスを統合してリソースを節約しようとしているため、今後も成長する予定です。

多くのありがとうございます。

+0

これらのクエリについて説明することはできますか? –

+0

あなたの理解は、二重化合物インデックスに厳密に当てはまりますが、三重化合物インデックスでは必ずしも真実である必要はありません。説明を使用すると、a、b、cの索引が実際にa、cで照会するときに使用されることがわかります。 –

答えて

3

一般に、列の1つに一致する行が十分に制限されていない複数列の索引に対する問合せでは、複数列索引の有用性が制限されます。あなたの例では、{"a":"foo", "b":{$ne:""}, "c":"thing"}のクエリ基準を使用すると{a,b,c}インデックスの有用性がaの場合にのみ一致するように制限されます。クエリ条件を頻繁に実行する場合は、{a,c,b}のインデックスを作成します(クエリの条件でbを使用しない場合は{a,c})。

クエリでexplain関数を使用して、インデックスが完全に使用されているかどうかを確認します。 explainindexOnlyと答えた場合は、trueです。照会では一致する文書を見つけるために索引を使用しています。さもなければ、MongoDBは一致を見つけるために各文書を見る必要があります。詳細について

、参照:実際に

0

を、新しいMongoのバージョンを使用して、{A、B、C}のインデックスは次のようになります{a、c}に対するクエリが存在し、bに対して必要な条件がない場合に使用されます。これを確認するには、explainコマンドを使用します。

ここで詳細な説明があります。Mongo Triple Compound Index

関連する問題