私はmongodbを使ってデバイスログのデータを管理しています。現在、100万件を超える文書があります。ドキュメントには埋め込みフィールドと結合する30以上のフィールドが含まれています。今、新しい文書を挿入すると、実際には遅いです。インサートのコストは1000ms以上です。時間によってmongodbの挿入が遅い
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "xxx.LogDeviceReport"
},
{
"v" : 1,
"key" : {
"time" : 1
},
"name" : "time_1",
"ns" : "xxx.LogDeviceReport",
"expireAfterSeconds" : 604800,
"background" : true
}
]
のみ_idインデックスとTTLインデックス、ない任意の他のインデックス:
{
"op" : "insert",
"ns" : "xxx.LogDeviceReport",
"query" : {
"_id" : ObjectId("xxxx"),
"deviceId" : ObjectId("xxxx"),
"en" : "xxxxxx",
"status" : 1,
'other fields, more than 30 fields...'
...
...
},
"ninserted" : 1,
"keyUpdates" : 0,
"writeConflicts" : 0,
"numYield" : 0,
"locks" : {
"Global" : {
"acquireCount" : {
"w" : NumberLong(2)
}
},
"MMAPV1Journal" : {
"acquireCount" : {
"w" : NumberLong(3)
}
},
"Database" : {
"acquireCount" : {
"w" : NumberLong(2)
}
},
"Collection" : {
"acquireCount" : {
"W" : NumberLong(1)
},
"acquireWaitCount" : {
"W" : NumberLong(1)
},
"timeAcquiringMicros" : {
"W" : NumberLong(1477481)
}
},
"oplog" : {
"acquireCount" : {
"w" : NumberLong(1)
}
}
},
"millis" : 977,
"execStats" : {
},
"ts" : ISODate("2016-08-02T22:01:01.270Z"),
"client" : "xxx.xxx.xxxx",
"allUsers" : [
{
"user" : "xxx",
"db" : "xxx"
}
],
"user" : "[email protected]"
}
私はこのように、インデックスをチェックする:スロークエリOPSから、私はこのようなログが取得します。
私は 'クエリ'が遅く動作すると思います。 mongodbのドキュメントでは、_idだけが一意であることが確認されますが、ログでは 'クエリ'のすべてのフィールドが重要ですか?
この理由がない場合、どうすれば遅くなりますか?誰も私を助けることができますか?
30フィールドである::詳細は
注用のMongoDBのブログからこのlinkを確認してくださいは、非常に多くのように思えます。おそらく質問以外にも、テーブルを追加してテーブル間の情報を減らすべきでしょう。 – Carcigenicate
コレクションにはいくつのインデックスがありますか?使用可能なRAMとの相対的なインデックスの大きさはどれくらいですか?各インデックスは、挿入操作ごとに更新する必要があります。インデックスの数が多いと、コレクションの各インサートの費用が増加します。 –
...アダムの質問の補遺として、これらのインデックスのどれだけが一意であると宣言されていますか? – mtj