Wir haben kürzlich die> 2 Millionen Rekorde für eine unserer Hauptsammlungen erreicht und leiden jetzt unter großen Leistungsproblemen bei dieser Sammlung.
Die Dokumente in der Sammlung enthalten ungefähr 8 Felder, die Sie mithilfe der Benutzeroberfläche filtern können. Die Ergebnisse sollen nach einem Zeitstempelfeld sortiert sein, in dem der Datensatz verarbeitet wurde.
Ich habe mehrere zusammengesetzte Indizes mit den gefilterten Feldern und dem Zeitstempel hinzugefügt, z.
db.events.ensureIndex({somefield: 1, timestamp:-1})
Ich habe auch einige Indizes für die gleichzeitige Verwendung mehrerer Filter hinzugefügt, um hoffentlich eine bessere Leistung zu erzielen. Die Ausführung einiger Filter dauert jedoch immer noch sehr lange.
Ich habe sichergestellt, dass mithilfe von EXPLAIN die Abfragen die von mir erstellten Indizes verwenden, die Leistung jedoch immer noch nicht gut genug ist.
Ich habe mich gefragt, ob Sharding jetzt der richtige Weg ist. Aber wir werden bald ungefähr 1 Million neue Platten pro Tag in dieser Sammlung haben. Ich bin mir also nicht sicher, ob es gut skaliert.
BEARBEITEN: Beispiel für eine Abfrage:
> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['nickey@acme.com']}}).sort({timestamp: -1}).limit(25).explain()
{
"cursor" : "BtreeCursor user.userName_1_timestamp_-1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 30060,
"nscanned" : 30060,
"nscannedObjectsAllPlans" : 120241,
"nscannedAllPlans" : 120241,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 26495,
"indexBounds" : {
"user.userName" : [
[
"nickey@acme.com",
"nickey@acme.com"
]
],
"timestamp" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "yarin:27017"
}
Bitte beachten Sie, dass deviceType nur 2 Werte in meiner Sammlung hat.
limit
Argument?