3

4,000万近くのレコードを含むMongoDBコレクションがあります。コレクションの現在のサイズは5GBです。このコレクションに保存されているデータには、次のフィールドが含まれています。

_id: "MongoDB id"
userid: "user id" (int)
mobile: "users mobile number" (int)
transaction: "transaction id" (int)
sms: "message sent to user mobile" (text)
created_dt: "unix timestamp of the transaction"

_idのインデックス(デフォルトで作成)とは別に、モバイルフィールドとトランザクションフィールドに別々のインデックスを定義しました。

ただし、次のクエリは完了するまでに60〜120秒かかります。

{
    mobile:<users mobile number>
}

RockMongoを使用してMongoDBにアクセスします。MongoDBは、16GBのRAMを搭載したサーバーでホストされています。このサーバーのほぼ8GBのRAMは無料です。

私がここで間違っているのは何ですか?

アップデート:

説明の出力:

{
    "cursor" : "BasicCursor",
    "nscanned" : 37145516,
    "nscannedObjects" : 37145516,
    "n" : 37145516,
    "millis" : 296040,
    "nYields" : 1343,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
    }
}

クエリ時のmongostatの出力

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
    13      2      0      0       0       1       0   168g   336g  6.86g      1        1          0       0|0     1|0    21k     1k    19   11:30:04 
    16      0      0      0       0       1       0   168g   336g  6.88g      0      0.1          0       0|0     1|0    21k     1k    19   11:30:05 
    14      0      0      0       0       1       0   168g   336g  6.86g      0        0          0       0|0     1|0    29k     1k    19   11:30:06 
    10      0      0      0       0       1       0   168g   336g  6.86g      0        0          0       0|0     1|0    19k     1k    19   11:30:07 
    16      0      0      0       0       1       0   168g   336g  6.88g      0      0.1          0       0|0     1|0    21k     1k    19   11:30:08 
     9      0      0      0       0       1       0   168g   336g  6.89g      0        0          0       0|0     1|0    13k     1k    19   11:30:09 
    19      0      0      0       0       1       0   168g   336g  6.89g      0        0          0       0|0     1|0    27k     1k    19   11:30:10 
    12      0      0      0       0       1       0   168g   336g  6.89g      1      1.2          0       0|0     1|0    24k     1k    19   11:30:11 
    17      0      0      0       0       1       0   168g   336g  6.89g      1      1.7          0       0|0     1|0    31k     1k    19   11:30:12 
    15      0      0      0       0       1       0   168g   336g  6.89g      0        0          0       0|0     1|0    19k     1k    19   11:30:13 

アップデート2:

最近まで、同じMongoDBサーバーに約13億のドキュメントを含む別のコレクションを保存していました。このコレクションは削除(削除)されました。これは、mongostatからの上記の出力のmapped/vsize列を説明している可能性があります。

サーバーには、頻繁に挿入される他の6つのコレクションも格納されます。現在、合計ストレージサイズは約35GBです。

アップデート3:

コレクションで定義されたインデックス。RockMongoを使用して作成されました。

[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "mymongodb.transaction_sms_details",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "_transaction_mobile_" : 1
    },
    "ns" : "mymongodb.transaction_sms_details",
    "background" : 1,
    "name" : "mobile"
},
{
    "v" : 1,
    "key" : {
        "_transaction_transaction_" : 1
    },
    "ns" : "mymongodb.transaction_sms_details",
    "background" : 1,
    "name" : "transaction"
}
]
4

1 に答える 1

2

RockMongoによって生成されたキーは明らかに正しくありません。

    "_transaction_mobile_" : 1
    "_transaction_transtion_" : 1

RockMongoの何が問題になっているのかわかりませんが、これで問題を解決できると思います。

db.xxx.dropIndexes();
db.xxx.ensureIndex({mobile: 1});
db.xxx.ensureIndex({transaction: 1});

注意:これには非常に長い時間がかかる場合があります。稼働中の本番マシンではこれを行わないでください。

于 2012-09-28T06:35:57.283 に答える