慢一系列基于查询中的MongoDB

问题描述:

我使用的MongoDB 3.2和具有90百万的数据集的大小,其中该文件结构由以下组成:将要执行慢一系列基于查询中的MongoDB

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

查询是:

1)范围

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如基于查询& 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} 

我使用同一台机器上3个碎片实例与shardkey:

{'eventStatus':1,'eventReceivedDateTime':1} 

利用这些构造,我正在缓慢结果用于上述查询。请建议如何优化/改善查询时间。

编辑:

碎片机规格:

Cores: 32 
RAM: 128g 
HD: 160G 

存储引擎是wiredTiger

解释()的查询可以在这个link找到。 “shard0000”, “的connectionString”:

在这种情况下
+0

1.你能告诉我们解释执行统计转储'db.col.query。解释(“executionStats”)'2.你有什么样的硬件/系统规格? 3.什么存储引擎正在使用? – profesor79

+0

@ profesor79我已添加信息。 – user1691461

+0

还有一个问题,处理器时钟是什么? – profesor79

为你一个系统

“shardName” 上运行的所有碎片 “本地主机:27012”,

“shardName”:“shard0001 ”, “的connectionString”: “本地主机:27013”,

“shardName”: “shard0002”, “的connectionString”: “本地主机:27014”,

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