21

MongoDB 1.6.3 を使用して、大きなコレクション (300k 以上のレコード) を保存しています。複合インデックスを追加しました。

db['collection_name'].getIndexes()
[
    {
        "name" : "_id_",
        "ns" : "db_name.event_logs",
        "key" : {
            "_id" : 1
        }
    },
    {
        "key" : {
            "updated_at.t" : -1,
            "community_id" : 1
        },
        "ns" : "db_name.event_logs",
        "background" : true,
        "name" : "updated_at.t_-1_community_id_1"
    }
]

ただし、このコードを実行しようとすると:

db['collection_name']
  .find({:community_id => 1})
  .sort(['updated_at.t', -1])
  .skip(@skip)
  .limit(@limit)

私は得ています:

Mongo::OperationFailure (インデックスなしで sort() のデータが多すぎます。インデックスを追加するか、より小さい制限を指定してください)

私は何を間違っていますか?

4

4 に答える 4

14

{community_id: 1, 'updated_at.t': -1}インデックスを追加してみてください。最初に検索してcommunity_idからソートする必要があります。

于 2010-12-09T16:18:42.763 に答える
4

したがって、インデックスを使用しているように「感じられます」が、インデックスは実際には複合インデックスです。ソートが部分インデックスのみを使用するのに「十分スマート」であるかどうかはわかりません。

だから2つの問題:

  1. クエリに基づいて、community_id をインデックスの最初の部分として配置し、2 番目の部分ではありません。updated_at.t範囲クエリを実行するフィールドのように聞こえます。範囲クエリが 2 番目のビットである場合、インデックスはより適切に機能します。
  2. から返されるエントリの数はcommunity_id => 1? 数が大きくない場合は、インデックスなしでソートするだけで済む場合があります。

そのため、インデックスを切り替える必要があり、並べ替えを変更して と の両方を使用する必要がある場合がありcommunity_idますupdated_at.t。冗長に思えるかもしれませんが、Google グループがまだ機能しない場合は、そこから始めて確認してください。

于 2010-12-09T16:18:49.117 に答える
2

インデックスがあっても、結果セットが 4MB を超えるとエラーが発生する可能性があると思います。

mongodb コンソールに移動して次のようにすると、サイズを確認できます。

show dbs
# pick yours (e.g., production)
use db-production
db.articles.stats()

私はこのような結果になりました:

{
"ns" : "mdalert-production.encounters",
"count" : 89077,
"size" : 62974416,
"avgObjSize" : 706.9660630690302,
"storageSize" : 85170176,
"numExtents" : 8,
"nindexes" : 6,
"lastExtentSize" : 25819648,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 18808832,
"indexSizes" : {
    "_id_" : 3719168,
    "patient_num_1" : 3440640,
    "msg_timestamp_1" : 2981888,
    "practice_id_1" : 2342912,
    "patient_id_1" : 3342336,
    "msg_timestamp_-1" : 2981888
},
"ok" : 1
}
于 2011-06-16T16:10:52.147 に答える
0

カーソルのバッチ サイズが大きすぎると、このエラーが発生します。バッチ サイズを設定しても、処理できるデータの量は制限されません。データベースから返されるデータの量が制限されるだけです。反復してバッチ制限に達すると、プロセスはデータベースへの別のトリップを行います。

于 2013-11-07T18:38:02.057 に答える