2016-04-15 11 views
0

Ich habe eine Mongo-Sammlung namens Elemente mit ~ 9 Millionen Dokumente. Jedes Dokument hat die folgende Struktur:MongoDB find() langsam beim Abfragen eines 64-Bit-Integer-Felds

{ 
    _id : "1", 
    Timestamp : Numberlong(12345), 
    Nationality : "ITA", 
    Value: 5 
} 

Wenn ich die folgende Abfrage ausführen:

db.Elements.find({ Nationality: 'ITA' }) 

die Abfrage führt schnell (wenige Millisekunden).

Wenn stattdessen betreibe ich die folgende Abfrage:

db.Elements.find({ Timestamp: 12345 }) 

die Abfrage ist langsam, in der Größenordnung von zehn Sekunden. Natürlich, wenn ich einen Index auf Timestamp hinzufügen, läuft die Abfrage viel schneller. Das Ausführen der gleichen Abfrage für das Feld Value, das vom Typ Int32 ist, wird so schnell wie die erste Abfrage ausgeführt.

Was ich versuche zu verstehen ist: Warum würde die zweite Abfrage (ohne Index) deutlich schlechter als die erste durchführen? Behandelt Mongo Int64-Werte anders als andere Werte?

+0

Auch bitte 'explain (" executionStats ")' für beide Arten von ganzen Zahlen. mit und ohne Indizes – Saleem

+0

Danke @JohnnyHK für den Vorschlag. Ich habe das gerade gemacht. –

Antwort

1

Es stellt sich heraus, dass ich einen Fehler gemacht habe.

Ich verwendete Robomongo, um die Abfragen auszuführen; Standardmäßig paginiert Robomongo die Ergebnisse (die Standardseitengröße beträgt 50 Elemente).

Da das Feld Timestamp Werte enthält, die fast immer unterschiedlich sind, musste die Abfrage einen fast vollständigen Scan durchführen, bevor sie gefüllt und eine Seite zurückgegeben werden konnte. Da die anderen Felder jedoch Werte enthalten, die einen begrenzten Bereich haben (das Feld Value, obwohl es Int32 ist, hat eine begrenzte Domäne in meiner Anwendung), erzielte ich schnell Ergebnisse, weil ich nur auf die erste Seite schaute.

Wenn ich die gleichen Abfragen ohne Seiten (z. B. durch Anhängen eines count oder Erlangen eines Ausführungsplans) ausführen, haben alle Abfragen schlechte Leistungen ohne Indizes.

Daher scheint es keine spezielle Behandlung von Int64-Werten im Gegensatz zu anderen primitiven Typen zu geben.