La consulta mongoDB ridículamente lenta en una colección pequeña en una base de datos simple pero grande
Así que tengo una base de datos súper simple en mongoDB con algunas colecciones:
> show collections
Aggregates <-- count: 92
Users <-- count: 68222
Pages <-- count: 1728288847, about 1.1TB
system.indexes
losAggregates
colección es un agregado de laPages
colección, y cada documento se ve así:
> db.Aggregates.findOne()
{
"_id" : ObjectId("50f237126ba71610eab3aaa5"),
"daily_total_pages" : 16929799,
"day" : 21,
"month" : 9,
"year" : 2011
}
Muy simple. Sin embargo, intentemos y obtengamos la carga total de la página agregando los 92 díasdaily page loads
juntos:
>>> 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 segundos?! ??! ??!?!
¡Esos 92 resultados agregados son minúsculos! También podría guardarlos en un archivo de texto, esto es una locura.
¿O son pequeños? ¿Qué tan grandes son en disco según mongo?
> 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 megabytes en total para esos diminutos números diarios? Cada uno tiene aproximadamente 280 bytes, por lo que deben tener un máximo de 25 ~ 30kb en total. Así que el almacenamiento es enorme y la consulta es muy lenta. ¿Es posible que pueda estar fragmentado en el disco? Creé los agregados después de insertar los documentos en el archivo completo.Pages
colección.
¿Alguien tiene alguna idea de esta locura? : O
Edición: resuelto con una consulta de encontrar () más específica por Jared. El video a continuación que Sammaye proporcionó también ofrece algunas ideas de almacenamiento muy interesantes.
Edit 2: Entonces descubrí que usar sys.getsizeof () es unDe Verdad Método no confiable para averiguar el tamaño de su documento, ya que no se retira de ningún árbol. Así que, en realidad, mis documentos eran bastante grandes, y lo mejor que podía hacer era usar find ({}, {'daily_page_loads'}) como una consulta más específica.