12

名前、アクティブ、重量の3つのフィールドを持つmongodbコレクション「機能」があります。機能を重みの降順で並べ替えます。

db.features.find({active:true},{name:1, weight:1}).sort({weight:-1})

最適化のために、私はそれのためのインデックスを作成します:

db.features.ensureIndex({'active': 1, 'weight': -1})

explain()クエリで使用するとうまく機能することがわかります。

ただし、重みの昇順でクエリを実行すると、作成したばかりのインデックスが機能せず、重みの昇順で別のインデックスを作成する必要があると思います。クエリ:

db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()

Explain() を使用してインデックスがどのように機能するかを示すと、次のように出力されます。

"cursor" : "BtreeCursor active_1_weight_-1 reverse",

インデックスの逆は、クエリがインデックスによって最適化されていることを意味しますか?

一般に、場合によっては昇順で並べ替え、場合によっては降順で並べ替える場合、重量の昇順と降順のような2つのインデックスを作成する必要がありますか?

4

4 に答える 4

13

遅くなりましたが、もう少し詳細を追加したいと思います。Explain() を使用して cursor: BtreeCursor を出力する場合、クエリを満たすためにインデックスのみが使用されるとは限りません。また、explain() の結果で「indexOnly」オプションをチェックする必要があります。indexOnly が true として出力される場合は、クエリがインデックスのみを使用して満たされ、コレクション内のドキュメントがまったく参照されなかったことを意味します。これは「カバーされたインデックス クエリ」と呼ばれます http://docs.mongodb.org/manual/applications/indexes/

しかし、explain の結果が cursor: BtreeCursor および indexOnly:false である場合は、インデックスの使用に加えて、コレクションも参照されたことを意味します。あなたの場合、クエリの場合:

    db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()

Mongo は、インデックス 'active': 1, 'weight': -1 を使用して、クエリの最初の部分、つまり db.features.find({active:true}) を満たし、インデックスを使用せずに並べ替えを実行します。したがって、正確に知るには、explain() 内の indexOnly の結果を確認する必要があります。

于 2013-02-16T15:13:16.190 に答える
9

このドキュメントからわかるように、explain()出力BtreeCursorの場合、インデックスが使用されたことを意味します。インデックスが使用される場合、indexBounds は、インデックスでスキャンするためのキー境界を示すように設定されます。ただし、putput が を示しBasicCursorた場合は、テーブル スキャン スタイルの操作を示します。

あなたが言ったことに基づいて、explain()結果から、BTree Cursor名前付きのインデックスで a を使用していることactive_1_weight_-1reverse、逆の順序でインデックスを反復処理していることがわかります。

いいえ、別のインデックスを作成する必要はありません。

于 2012-08-23T08:40:20.200 に答える
1

2.0以降を使用していると仮定すると、逆トラバーサルはMongoDBにとってよりコストがかからないため、この場合、順方向/逆方向の並べ替え用に個別のインデックスを作成する必要はありません。必要に応じて、作成してhint()を使用して確認できます(オプティマイザーは現在のインデックスをしばらくキャッシュするため、他のインデックスは自動的に選択されません)。

于 2012-08-23T08:34:09.233 に答える