MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como acelerar a consulta do mongo


Algumas coisas que você pode fazer aqui:

Primeiro de tudo, use um $in em vez de um $or.

Em segundo lugar, o MongoDB pode somente use um índice para sua primeira partida, então você terá que decidir (experimentando) qual das duas partidas é melhor. O objetivo é ter uma consulta tão rápida e menos documentos passando pelo pipeline. Para isso você faz o seguinte:

Primeiro, crie os três índices:
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );

Em seguida, execute as três consultas a seguir e observe os campos "cursor", "n", "nScanned" e "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 a última consulta, você notará que "cursor" é "BasicCursor", porque uma consulta $ne não pode usar o índice.

Os outros dois mostrarão vários valores para "ms", "n" e "nScanned". "ms" é o tempo que levou para executar a consulta. Se isso for aproximadamente o mesmo, observe a diferença entre os valores "n" e "nScanned". Eu vou esperar e adivinhar que a diferença para a consulta "versions.branch" é 0. Para a consulta "doctype" pode ser diferente. Se o "ms" não for aproximadamente o mesmo, coloque o $match que foi o mais rápido primeiro como a cláusula $match em seu pipeline de agregação.

Se a velocidade ("ms") for a mesma, verifique os valores "n". Se o "n" para a consulta "prefixo" for "5" e o "n" para a consulta "versions.branch" for "500", isso significa que o resultado da consulta "prefixo" é melhor, pois menos documentos são devolvidos. Nesse caso, coloque isso como sua primeira cláusula $match no agregado. Se o "versions.branch" for muito menor, use-o como primeira cláusula $match.