2016-04-22 80 views
0

我使用的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

回答

0

爲你一個系統

「shardName」 上運行的所有碎片 「本地主機:27012」,

「shardName」:「shard0001 」, 「的connectionString」: 「本地主機:27013」,

「shardName」: 「shard0002」, 「的connectionString」: 「本地主機:27014」,

它會更好避免使用分片,因爲他們正在爭奪系統資源。