MongoDb中基于慢速范围的查询

时间:2016-04-22 07:50:35

标签: mongodb sharding bigdata

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

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

要执行的查询是:

1)基于范围的查询涉及eventStatus& eventReceivedDateTime喜欢:

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}

使用这些配置,我对上述查询的结果会变慢。请建议如何优化/改善查询时间。

编辑:

<\ n>碎片机规格:

Cores: 32
RAM:  128g
HD:   160G

存储引擎是wiredTiger

可以在此link找到

explain()查询。

1 个答案:

答案 0 :(得分:0)

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

  

&#34; shardName&#34; :&#34; shard0000&#34;,&#34; connectionString&#34; :&#34; localhost:27012&#34;,

     

&#34; shardName&#34; :&#34; shard0001&#34;,&#34; connectionString&#34; :&#34; localhost:27013&#34;,

     

&#34; shardName&#34; :&#34; shard0002&#34;,&#34; connectionString&#34; :&#34; localhost:27014&#34;,

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