0

aフィールドと。を持つMongoコレクションがあるとしますb。このコレクションに、0から1000まで繰り返し増加する{a:'a', b : index }場所を入力しました。index

私はこれが非常に、非常に間違っていることを知っていますが、理由を説明することはできません(しゃれは意図されていません):

collection.find({i:{$gt:500}}).explain()インデックスが使用されていないことを確認します(コレクション内の1,000個のドキュメントすべてをスキャンしたことがわかります)。

ここに画像の説明を入力してください

どういうわけか、Mongoにインデックスの使用を強制することはうまくいくようです:

collection.find({i:{$gt:500}}).hint({a:1,i:1}).explain()

ここに画像の説明を入力してください

編集 Mongoのドキュメントは、クエリ用語の1つが複合インデックスの最初の用語と一致する場合にのみ複合インデックスを使用することを非常に明確にしています。この場合、ヒントを使用すると{a:1,i:1}、クエリ用語にが含まれていなくても、Mongoが複合インデックスを使用したように見えますa。これは本当ですか?

4

1 に答える 1

0

MongoDB がクエリを実行する方法の興味深い点は、実際に複数のクエリを並行して実行して、最適なプランを判断できることです。シェルから行った他の実験のために、またはデータを追加したときや、それがメモリ内にあるかどうかなど (または他のいくつかの要因) のために、インデックスを使用しないことを選択した可能性があります。パフォーマンスの数値を見ると、インデックスを使用した方が実際にはそうでない場合よりも速かったとは報告されていません (ただし、一般に、これらの数値をあまり気にするべきではありません)。この場合、データセットは非常に小さいです。

しかし、さらに重要なことに、MongoDB のドキュメントによると、ヒント付きの実行からの出力は、クエリがインデックス ( ) によって完全にカバーindexOnly=falseされていないことも示唆しています。

これは、インデックスがa:1, i:1であるにもかかわらず、クエリが であるためiです。複合インデックスは、インデックス付きフィールドの任意のプレフィックスに基づく検索のみをサポートします (つまり、指定された順序である必要があります)。

http://docs.mongodb.org/manual/core/read-operations/#query-optimization

参考:詳細オプションを使用して、find() で考慮されたすべての計画のレポートを表示します。

于 2013-01-22T01:20:22.340 に答える