Lächerlich langsame mongoDB-Abfrage für eine kleine Sammlung in einer einfachen, aber großen Datenbank
Ich habe also eine supereinfache Datenbank in MongoDB mit ein paar Sammlungen:
> show collections
Aggregates <-- count: 92
Users <-- count: 68222
Pages <-- count: 1728288847, about 1.1TB
system.indexes
DasAggregates
Sammlung ist ein Aggregat derPages
Sammlung, und jedes Dokument sieht folgendermaßen aus:
> db.Aggregates.findOne()
{
"_id" : ObjectId("50f237126ba71610eab3aaa5"),
"daily_total_pages" : 16929799,
"day" : 21,
"month" : 9,
"year" : 2011
}
Sehr einfach. Versuchen wir jedoch, die Gesamtzahl der Seitenladevorgänge zu ermitteln, indem wir alle 92 Tage hinzufügendaily page loads
zusammen:
>>> def get_total():
... start = datetime.now()
... print sum([x['daily_total_pages'] for x in c.Aggregates.find()])
... end = datetime.now()
... print (end-start).seconds
...
>>> get_total()
1728288847
43
43 Sekunden?! ??! ??!?!
Diese 92 Gesamtergebnisse sind winzig! Ich könnte sie genauso gut in einer Textdatei speichern, das ist verrückt.
Oder sind sie winzig? Wie groß sind sie laut Mongo auf der Festplatte?
> db.Aggregates.stats()
{
"ns" : "c.AggregateResults",
"count" : 92,
"size" : 460250104,
"avgObjSize" : 5002718.521739131,
"storageSize" : 729464832,
"numExtents" : 7,
"nindexes" : 2,
"lastExtentSize" : 355647488,
"paddingFactor" : 1.0690000000000066,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"date_1" : 8176
},
"ok" : 1
}
438 Megabyte für diese winzigen täglichen Zahlen? Jedes ist ungefähr 280 Bytes, sie sollten also maximal 25 ~ 30kb groß sein. Der Speicherplatz ist also riesig und die Abfrage ist sehr langsam. Ist es möglich, dass es auf der Festplatte fragmentiert sein könnte? Ich habe die Aggregate erstellt, nachdem ich die Dokumente vollständig eingefügt habePages
Sammlung.
Hat jemand einen Einblick in diesen Wahnsinn? :O
Bearbeiten: Mit spezifischer find () Abfrage von Jared gelöst. Das von Sammaye bereitgestellte Video gibt auch einige sehr interessante Einblicke in die Speicherung.
Edit 2: Also fand ich heraus, dass mit sys.getsizeof () ist einJa wirklich unzuverlässige Methode, um die Größe Ihres Dokuments herauszufinden, da es keine Bäume wiederverwendet. Tatsächlich waren meine Dokumente also ziemlich umfangreich, und das Beste war, find ({}, {'daily_page_loads'}) als spezifischere Abfrage zu verwenden!