6

次のコマンドを実行します。

db.ads_view.aggregate({$group: {_id : "$campaign", "action" : {$sum: 1} }});

ads_view : 500,000 ドキュメント。

このクエリには 1.8 秒かかります。これはそのプロファイルです: https://gist.github.com/afecec63a994f8f7fd8a

インデックス付き: db.ads_view.ensureIndex({キャンペーン: 1});

しかし、mongodb はインデックスを使用しません。フレームワークの使用インデックスを集約できるかどうか、このクエリにインデックスを付ける方法は誰でも知っています。

4

3 に答える 3

7

この$group演算子は、現在インデックスを使用する演算子の 1 つではありません。(2.2 時点で) 行う演算子のリストは次のとおりです。

$match
$sort
$limit
$skip

ここから:

http://docs.mongodb.org/manual/applications/aggregation/#pipeline-operators-and-indexes

Gist で行われている yield の数に基づいて、非常にアクティブなインスタンスがあるか、グループを実行しているときにこのデータの多くがメモリにないことを想定します (通常はページ フォールトでも生成されます)。したがって、1.8秒

$groupインデックスを使用でき、インデックスがグループ化されているすべてのものをカバーしていたとしても、グループ化を行うためにインデックスのフル スキャンが必要であり、とにかく高速ではない可能性が高いことに注意してください。

于 2012-11-20T03:28:26.773 に答える
0

$group必要がないため、インデックスを使用しません。アイテムを使用すると、基本的に、パイプラインのステージを通過$groupするすべてのドキュメントにインデックスを付けます。に一致するインデックスを使用した場合でも、インデックス内のすべてのドキュメントを通過する必要があるため、作業量は同じです。$group$group_id$group_id

于 2014-09-13T23:37:09.237 に答える