2012-04-13 9 views
10

En MongoDB, puede obtener una explicación de cómo se ejecuta una consulta, la información sobre el rendimiento interesante:¿Cómo obtener una explicación para un conteo de MongoDB?

> db.people.find({ 'items' : { '$gte' : 1 } }).explain() 

¿Puedo obtener el mismo para un "recuento" (que no es una pregunta, sino una orden) ?

> db.people.count({ 'items' : { '$gte' : 1 } }) 

Respuesta

3

Estoy bastante seguro de que count (query) es la abreviatura de find (query) .count() - en otras palabras, la explicación es exactamente la misma. No hay una optimización de recuento específica realizada, excepto tal vez para un recuento de recopilación completo. Por ejemplo, ejecutar un recuento en un campo no indexado para un rango lleva exactamente la misma cantidad de tiempo que ejecutar un find.explain con el mismo rango.

Escribí una función llamada timeCount que toma el promedio del tiempo de la función de conteo, y luego muestra la salida de explicación para la comparación.

function timeCount(coll, query) { 
    var n = 5; 
    var total = 0; 
    for(var i = 0; i < n; i++) { 
    var start = new Date(); 
    db[coll].find(query).count(); 
    var end = new Date(); 
    total += (end - start); 
    print("time[" + i + "]: " + (end - start) + "ms"); 
    } 
    print("average time: " + (total/n)); 

    var explain = db[coll].find(query).explain(); 
    print("explain (from find): "); 
    for(e in explain) { 
    if(typeof explain[e] == "string" || typeof explain[e] == "number") { 
     print(e + ": " + explain[e]); 
    } 
    } 
} 

La salida tiene el siguiente aspecto:

> timeCount('test',{x:{$gt:5000}}); 
time[0]: 1339ms 
time[1]: 1280ms 
time[2]: 1347ms 
time[3]: 1322ms 
time[4]: 1299ms 
average time: 1317.4 
explain (from find): 
cursor: BtreeCursor x_1_y_1 
nscanned: 995062 
nscannedObjects: 995062 
n: 995062 
millis: 1390 
nYields: 0 
nChunkSkips: 0 
+1

"Estoy bastante seguro de que count (query) es la abreviatura de find (query) .count() - en otras palabras, la explicación es exactamente la misma". Sí, pero no se puede obtener fácilmente una explicación de: 'db.people.find ({}). Count(). Explain()' es un error, al igual que 'db.people.count ({}). Explain () '. – Thilo

+1

Solo decía que la explicación de find() te dará los mismos resultados que una explicación hipotética del recuento. –

+2

No, eso no tiene sentido. Un hallazgo tiene que recuperar documentos, un recuento no. Con un índice, debería marcar una gran diferencia. – Thilo

Cuestiones relacionadas