sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo acelerar la consulta mongo

Algunas cosas que puedes hacer aquí:

En primer lugar, use $in en lugar de $or.

En segundo lugar, MongoDB puede solo use un índice para su primera coincidencia, por lo que tendrá que decidir (probándolo) cuál de las dos coincidencias es mejor. El objetivo es tener una consulta lo más rápida posible y menos documentos en proceso. Para eso haces lo siguiente:

Primero, cree los tres índices:

db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );

Luego ejecute las siguientes tres consultas y observe los campos "cursor", "n", "nScanned" y "ms":

branch = "nameofbranch"; // guessing here
db.element.find( "versions.branch": branch ).explain();
db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
db.element.find( "prefix": { $ne: "500" } ).explain();

Para la última consulta, notará que "cursor" es "BasicCursor", porque una consulta $ne no puede usar el índice.

Los otros dos le mostrarán varios valores para "ms", "n" y "nScanned". "ms" es el tiempo que tomó ejecutar la consulta. Si esto es aproximadamente lo mismo, observe la diferencia entre los valores "n" y "nScanned". Voy a esperar y adivinar que la diferencia para la consulta "versions.branch" es 0. Para la consulta "doctype" podría ser diferente. Si el "ms" no es aproximadamente el mismo, coloque $match que fue el más rápido primero como cláusula $match en su tubería de agregación.

Si la velocidad ("ms") es la misma, verifique los valores "n". Si la "n" de la consulta "prefijo" es "5" y la "n" de la consulta "versiones.rama" es "500", eso significa que el resultado de la consulta "prefijo" es mejor, ya que hay menos se devuelven los documentos. En ese caso, póngalo como su primera cláusula $match en conjunto. Si "versions.branch" es mucho menor, utilícelo como la primera cláusula $match.