mongodb插入真的很慢

时间:2016-08-04 01:58:13

标签: mongodb performance insert

我使用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'中的所有字段都重要吗?

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

1 个答案:

答案 0 :(得分:1)

如果您使用的是mongodb 3+,您可以考虑使用 WiredTiger 作为存储引擎,而不是在您的情况下使用 MMAPV1

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

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

请从MongoDB博客查看此link以获取更多信息

注意::这仅来自 MongoDB 3.0 +