2016-04-22 7 views
0

Ich bin mit MongoDB 3.2 und eine Datensatzgröße von 90 Millionen haben, wo die Dokumentstruktur besteht aus:Langsam Bereich basierte Abfragen in MongoDB

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

Abfragen ausgeführt werden sollen:

1) Bereich basierend Anfragen mit eventStatus & eventReceivedDateTime wie:

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) Reichweite basierte Abfragen die eventStatus & eventReceivedDateTime und _id und mit Sortierung. (Für Paginierung), wie:

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) Bereich basierte Abfragen Einbeziehung eventStatus, eventReceivedDateTime, systemName und triggerName wie:

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) Bereich basierte Abfragen Einbeziehung eventStatus, eventReceivedDateTime, systemName, triggerName und _id und mit Sortierung. (Für Paginierung), wie:

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); 

Jeden Tag werden etwa 3 Millionen Dokumente eingefügt und gelöscht.

Ich habe das aus folgenden Verbindung Indizes:

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

Ich bin mit 3 Shard Instanzen auf derselben Maschine mit shardkey:

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

Mit diesen Konfigurationen mich langsam Ergebnisse für die oben bekommen Abfragen. Bitte schlagen Sie vor, wie Sie die Abfragezeit optimieren/verbessern können.

Edit:

Shard Maschine Spezifikationen:

Cores: 32 
RAM: 128g 
HD: 160G 

Speicher-Engine ist wiredTiger

erklären() für die Abfrage kann an dieser link finden.

+0

1. könnten Sie uns zeigen, erklären Ausführung Stats dump 'db.col.query.erklären ("executionStats") '2. Welche Art von Hardware/Systemspezifikationen haben Sie? 3. Welche Storage Engine wird verwendet? – profesor79

+0

@ profesor79 Ich habe die Informationen hinzugefügt. – user1691461

+0

eine weitere Frage, was ist der Prozessortakt? – profesor79

Antwort

0

in diesem Fall, wie Sie alle Scherben haben auf einem System

laufen

"shardName": "shard0000", "Connection": "localhost: 27012",

"shardName": „shard0001 “, "connection~~POS=TRUNC": "localhost: 27013",

"shardName": "shard0002", "connection~~POS=TRUNC": "localhost: 27014",

wird es besser sein, vermeiden Sie Sharing, da sie um Systemressourcen kämpfen.