Übermäßig langsam MongoDB-Abfrage, obwohl die Abfrage ist einfach und ausgerichtet auf die Indizes

Bin ich mit einem MongoDB-server (das ist buchstäblich alles hat es ausgeführt). Der server hat 64 GB RAM und 16 Kerne, plus 2 TB Festplattenspeicher, mit zu arbeiten.

Die Dokument-Struktur

Die Datenbank eine Sammlung domains mit rund 20 Millionen Dokumente. Es gibt eine anständige Menge an Daten, die in jedem Dokument, aber für unsere Zwecke, Das Dokument gliedert sich wie folgt:

{
    _id: "abcxyz.com",
    LastUpdated: <date>,
    ...
}

Das _id Feld ist der name der Domäne verwiesen wird, die durch das Dokument. Es ist ein aufsteigender index auf LastUpdated. LastUpdated ist aktualisiert auf Hunderte oder Tausende von Datensätzen pro Tag. Im Grunde jedes mal, wenn neue Daten zur Verfügung stehen, für ein Dokument, das Dokument wird aktualisiert und die LastUpdated Feld aktualisiert, um das aktuelle Datum/Zeit.

Die Abfrage

Habe ich einen Mechanismus, der extrahiert die Daten aus der Datenbank, so kann es indiziert sein, in einem Lucene-index. Die LastUpdated Feld ist der wichtigste Treiber für die Kennzeichnung von änderungen an einem Dokument vorgenommen. Um nach Dokumenten zu suchen, die verändert wurden und Seiten, die über diese Unterlagen habe ich das folgende tun:

{
    LastUpdated: { $gte: ISODate(<firstdate>), $lt: ISODate(<lastdate>) },
    _id: { $gt: <last_id_from_previous_page> }
}

sort: { $_id:1 }

Wenn keine Dokumente zurückgegeben werden, die start-und Enddaten, die vorwärts-und die _id "anchor" - Feld zurückgesetzt. Dieses setup ist tolerant, um Dokumente aus früheren Seiten, deren LastUpdated Wert geändert, d.h. die Auslagerung nicht falsch-offset um die Anzahl der Dokumente, die in den vorangegangenen Seiten, sind heute technisch nicht mehr in den Seiten.

Das Problem

Möchte ich im Idealfall wählen Sie über 25000 Dokumente gleichzeitig, aber für einige Grund der Abfrage selbst (auch wenn nur eine Auswahl von <500 Belege) ist extrem langsam.

Die Abfrage, die ich lief war:

db.domains.find({
    "LastUpdated" : {
        "$gte" : ISODate("2011-11-22T15:01:54.851Z"),
        "$lt" : ISODate("2011-11-22T17:39:48.013Z")
    },
    "_id" : { "$gt" : "1300broadband.com" }
}).sort({ _id:1 }).limit(50).explain()

Es ist so langsam in der Tat, die erklären, (zum Zeitpunkt des Schreibens dieses) läuft schon seit über 10 Minuten und ist noch nicht abgeschlossen. Ich werde über diese Frage, ob es jemals endet, aber der Punkt ist natürlich, dass die Abfrage EXTREM langsam.

Was kann ich tun? Ich habe nicht die leiseste Ahnung, was das problem sein könnte mit der Abfrage.

BEARBEITEN
Das erklären beendet nach 55 Minuten. Hier ist es:

{
    "cursor" : "BtreeCursor Lastupdated_-1__id_1",
    "nscanned" : 13112,
    "nscannedObjects" : 13100,
    "n" : 50,
    "scanAndOrder" : true,
    "millis" : 3347845,
    "nYields" : 5454,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
            "LastUpdated" : [
                    [
                            ISODate("2011-11-22T17:39:48.013Z"),
                            ISODate("2011-11-22T15:01:54.851Z")
                    ]
            ],
            "_id" : [
                    [
                            "1300broadband.com",
                            {

                            }
                    ]
            ]
    }
}

InformationsquelleAutor der Frage Nathan Ridley | 2011-11-23

Schreibe einen Kommentar