3

MongoDB を実行して、3 列のキー ルックアップ (a、b、c) を優先順位 (d) でキューに入れようとしています。私は(pymongo構文)のようなクエリを持っています:

collection.find({'a':'foo','b':'bar','c':'baz'}, sort = [('d', -1)] )

複合インデックス (a+1、b+1、c+1、d-1) を使用して Explain を実行すると、フル テーブル スキャンと BasicCursor が表示されます。

d に単一のインデックスがある場合、explain は d インデックスのみが使用されていることを示します。

大きなテーブルの場合、私が本当に望んでいるのは、複合インデックスを使用することです。どうすればこれを機能させることができますか?

INDEX_INFORMATION: {u' id ': {u'key': [(u'_id', 1)], u'v': 1}, u'color_1_level_1_in_progress_1_Ranking_-1': {u'key': [(u' color', 1), (u'level', 1), (u'in_progress', 1), (u'Ranking', -1)], u'v': 1}}

EXPLAIN ON A FIND+SORT QUERY
db.coll.find({'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green]} },  sort = [('Ranking', -1)] ).explain()

OUTPUT ON EXPLAIN
OperationFailure: database error: too much data for sort() with no index.  add an index or specify a smaller limit


THE QUEUEING QUERY I CARE ABOUT OPTIMIZING
coll.find_and_modify(
  query = {'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green']} },
  sort = {'Ranking' : -1},                                                                                                                                                                             
  update = {'$set': {'in_progress': 1}} 
)   

並べ替えフィールド「ランキング」にインデックスを追加すると、ランキング インデックスが使用されているという説明が返されることに注意してください。ただし、複合インデックスは使用されず、1.5 MM のドキュメント テスト コーパスではパフォーマンスが非常に遅くなります。

4

2 に答える 2

2

クエリを実行するときに、と呼ばれる特定のインデックスの使用を強制する方法がありますhint

カーソルで呼び出すだけです。

cursor = collection.find({query-doc}).hint({index-fields})
于 2012-08-24T21:13:26.467 に答える
1

Mongodb インデックス作成システムは、実験に基づいています。基本的に、クエリ オプティマイザーは、考えられるすべてのインデックスを使用してクエリを実行し、それぞれの時間を比較します。特定のタイプのクエリに最適なインデックスを使用することを学習します。クエリオプティマイザーのドキュメントから:

新しいプランをテストするとき、MongoDB は複数のクエリ プランを並行して実行します。1 つが終了するとすぐに、他の実行が終了し、システムはどの計画が適切かを学習します。

コレクションが非常に小さい場合は、クエリ オプティマイザーによって選択されたインデックスが最適と思われるものではない可能性があります。ただし、このクエリとこのコレクションの方が高速です。コレクションが大きくなると、別のインデックスの方が適している可能性があります。

あなたの場合、ドキュメントが非常に少ないため、mongoがすべてのドキュメントをスキャンしてからdのインデックスでソートする方が簡単だと思います。

より多くのドキュメント (たとえば 100 万) を持つコレクションに対して同じクエリを (学習を効率的にするために数回) 実行してみてください。おそらく、完全なインデックスが使用されることがわかります。

したがって、 oe ヒントを使用する必要はありません (害はありません)。私のアドバイス:mongoクエリオプティマイザーに仕事をさせてください:-)

于 2012-08-25T08:47:54.513 に答える