mongodb插入非常慢
我使用mongodb来管理设备日志数据。目前,它有超过一百万份文件。该文档包含超过30个与嵌入字段相结合的字段。现在,当我插入新文档时,速度非常慢。插入成本超过1000毫秒。从慢查询OPS,我得到的日志是这样的:mongodb插入非常慢
{
"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]"
}
我查了指数,就像这样:
[
{
"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文档中,它告诉只有_id将被检查唯一,但是在日志中,'查询'中的所有字段是否有关系?
如果不是这个原因,是什么让它如此缓慢?谁能帮我 ?
如果您正在使用MongoDB的3+可以考虑使用WiredTiger作为存储引擎比MMAPV1这是在你的情况下被使用。
当我一次插入156000个文档时,我个人看到了改进达400次。
MMAPV1花了大约40分钟,当我切换到WiredTiger时,同样的任务在10分钟内完成。
请检查该link从MongoDB的博客以获取更多信息
注::这只是从MongoDB的3.0 +
让我看看,非常感谢! – hudao
我发送的链接声称在7倍到10倍范围内的改善,但任何改善都是改善 – rajadilipkolli
你试过切换吗?运气好的话? – rajadilipkolli
30场似乎像一个可怕的很多。除了这个问题外,可能还需要添加更多的表格并减少表格之间的信息。 – Carcigenicate
集合上有多少个索引?索引相对于可用RAM有多大?每个插入操作都需要更新每个索引;大量索引将增加集合上每个插入的开销。 –
...作为亚当问题的附录:这些索引中有多少被声明为唯一的? – mtj