1

これは少し奇妙なものです。特定の要素が存在するかどうかを確認するクエリを使用して、非常に大きなデータベースを反復処理しています。ヒントなしでデータベースでこのクエリを実行すると、約 137 秒かかりますが、ヒントを使用すると 0 になります (これは明らかに望ましいことです)。php経由で利用する場合

$collection->find($params)->hint(array("responses" => 1))->count();

そして、私がこれを取得しているクエリをプロファイリングします:

{ "ts" : ISODate("2012-05-08T10:11:24.682Z"), "op" : "コマンド", "ns" : "ey_gsat.$cmd", "コマンド" : { "カウント" : " survey_answers", "クエリ": { "responses.93": { "$exists": true }, "responses.96": { "$exists": true }, "responses.99": { "$exists": true }, "responses.102" : { "$exists" : true }, "responses.105" : { "$exists" : true }, "responses.108" : { "$exists" : true }, "responses .111" : { "$exists" : true }, "responses.114" : { "$exists" : true }, "responses.117" : { "$exists" : true }, "responses.120" : { "$exists" : true }, "response.1": { "$exists": true } } }, "ntreturn": 1, "responseLength": 48, "millis": 137, "client": "127.0.0.1", "user": "" }

PHP経由で実行した場合、クエリが実際にインデックスを使用している兆候はありません。私はこのサイトでこのようなクエリをかなりの数実行しているため、137 ミリ秒がすべて加算されるため、それらを最適化したい理由があります。何が間違っているのでしょうか?

4

1 に答える 1

1

これはカウントの既知の制限です:https ://jira.mongodb.org/browse/SERVER-2677 。この問題をフォロー/投票することをお勧めします。残念ながら、回避策はありません。可能な限りカウントをキャッシュするか、合計を見積もることを検討することをお勧めします。

于 2012-05-08T19:10:50.457 に答える