我使用mongodb来管理设备日志数据。现在,它有超过一百万份文件。该文档包含超过30个与嵌入字段组合的字段。现在,当我插入新文档时,它真的很慢。插入成本超过1000毫秒。从慢查询操作,我得到这样的日志:
{
"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" : "xx@xx"
}
我检查了索引,如下所示:
[
{
"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索引的时间,没有任何其他索引。
我猜'查询'会减慢操作速度。在mongodb doc中,它告诉我只检查_id是唯一的,但在日志中,'query'中的所有字段都重要吗?
如果不是这个原因,是什么让它如此缓慢?谁能帮我 ?
答案 0 :(得分:1)
如果您使用的是mongodb 3+,您可以考虑使用 WiredTiger 作为存储引擎,而不是在您的情况下使用 MMAPV1 。
当我一次插入多达156000个文档时,我个人看到了改进达400次。
MMAPV1大约需要40分钟,当我切换到WiredTiger时,同样的任务在10分钟内完成。
请从MongoDB博客查看此link以获取更多信息
注意::这仅来自 MongoDB 3.0 +