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将被检查唯一,但是在日志中,'查询'中的所有字段是否有关系?

如果不是这个原因,是什么让它如此缓慢?谁能帮我 ?

+0

30场似乎像一个可怕的很多。除了这个问题外,可能还需要添加更多的表格并减少表格之间的信息。 – Carcigenicate

+0

集合上有多少个索引?索引相对于可用RAM有多大?每个插入操作都需要更新每个索引;大量索引将增加集合上每个插入的开销。 –

+0

...作为亚当问题的附录:这些索引中有多少被声明为唯一的? – mtj

如果您正在使用MongoDB的3+可以考虑使用WiredTiger作为存储引擎比MMAPV1这是在你的情况下被使用。

当我一次插入156000个文档时,我个人看到了改进达400次。

MMAPV1花了大约40分钟,当我切换到WiredTiger时,同样的任务在10分钟内完成。

请检查该link从MongoDB的博客以获取更多信息

注::这只是从MongoDB的3.0 +

+0

让我看看,非常感谢! – hudao

+0

我发送的链接声称在7倍到10倍范围内的改善,但任何改善都是改善 – rajadilipkolli

+0

你试过切换吗?运气好的话? – rajadilipkolli