MongoDb 中基于慢范围的查询

Posted

技术标签:

【中文标题】MongoDb 中基于慢范围的查询【英文标题】:Slow Range Based Queries in MongoDb 【发布时间】:2016-08-15 17:47:08 【问题描述】:

我使用的是 MongoDb 3.2,数据集大小为 9000 万,其中文档结构包括:

_id
eventReceivedDateTime(Date)
systemName(String)
triggerName(String)
eventStatus (Enum with 4 possible values)

要执行的查询是:

1) 涉及eventStatuseventReceivedDateTime 的基于范围的查询,例如:

db.event_record.find(
    "eventStatus": "SENT",
    "eventReceivedDateTime": 
        "$gt": ISODate("2016-04-19T23:46:30.827Z"),
        "$lt": ISODate("2016-04-21T14:18:30.827Z")
    
).count();

2) 涉及eventStatus & eventReceivedDateTime_id 并涉及排序的基于范围的查询。 (用于分页),例如:

db.event_record.find(
    "eventStatus": "SENT",
    "eventReceivedDateTime": 
        "$gt": ISODate("2016-04-19T23:46:30.827Z"),
        "$lt": ISODate("2016-04-21T07:18:30.827Z")
    ,
    "_id": 
        "$gt": ObjectId("57173a67e4b09ca56feddddf")
    
).sort("_id":1).limit(10);

3) 涉及eventStatuseventReceivedDateTimesystemNametriggerName 的基于范围的查询,例如:

db.event_record.find(
    "eventStatus":"SENT",
    "eventReceivedDateTime": 
        "$gt": ISODate("2016-04-19T23:46:30.827Z"),
        "$lt": ISODate("2016-04-21T07:18:30.827Z")
    ,
    "systemName": "OMS",
    "triggerName": "COD_ORDER"
).count();

4) 涉及eventStatuseventReceivedDateTimesystemNametriggerName_id 并涉及排序的基于范围的查询。 (用于分页),例如:

db.event_record.find(
    "eventStatus": "SENT",
    "eventReceivedDateTime": 
        "$gt": ISODate("2016-04-19T23:46:30.827Z"),
        "$lt": ISODate("2016-04-21T07:18:30.827Z")
     ,
     "systemName": "OMS",
     "triggerName": "COD_ORDER",
     "_id": 
          "$gt":ObjectId("57173a67e4b09ca56feddcd6")
     
).sort("_id":1).limit(10);

每天将插入和删除大约 300 万个文档。

我制作了以下复合索引:

'eventStatus':1,'eventReceivedDateTime':1,'_id':1
'eventStatus':1,'systemName':1,'triggerName':1,'eventReceivedDateTime':1
'eventStatus':1,'systemName':1,'triggerName':1,'eventReceivedDateTime':1,'_id':1

我使用 shardkey 在同一台机器上使用 3 个 Shard 实例:

'eventStatus':1,'eventReceivedDateTime':1

使用这些配置,上述查询的结果很慢。请建议如何优化/改进查询时间。

编辑:

分片机规格:

Cores: 32
RAM:  128g
HD:   160G

存储引擎是wiredTiger

explain() 可以在link 找到查询。

【问题讨论】:

1.你能告诉我们解释执行统计转储db.col.query.explain("executionStats") 2. 你有什么样的硬件/系统规格? 3. 使用的是什么存储引擎? @profesor79 我已经添加了信息。 还有一个问题,处理器时钟是多少? 【参考方案1】:

在这种情况下,因为您在一个系统上运行所有分片

"shardName" : "shard0000","connectionString" : "localhost:27012",

"shardName" : "shard0001","connectionString" : "localhost:27013",

"shardName" : "shard0002","connectionString" : "localhost:27014",

最好避免使用分片,因为它们正在争夺系统资源。

【讨论】:

以上是关于MongoDb 中基于慢范围的查询的主要内容,如果未能解决你的问题,请参考以下文章

mongodb查询速度慢是啥原因

mongodb查询响应时间慢

nodejs + mongodb实现模糊查询与全文搜索

为啥我的 MongoDB 聚合查询这么慢

一个cp命令引发的mongodb大量慢查询

优化JAVA查询Mongodb数量过大,查询熟读慢的方法