MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Requête MongoDB simple très lente bien que l'index soit défini

Vous n'avez aucun index que mongo utilisera automatiquement pour cela, il effectue donc une analyse complète de la table.

Comme mentionné dans la documentation

Pourquoi

Si vous avez un index sur a,b - et que vous recherchez par a seul - un index sera automatiquement utilisé. C'est parce que c'est le début de l'index (ce qui est rapide à faire), la base de données peut simplement ignorer le reste de la valeur de l'index.

Un index sur a,b est inefficace lors de la recherche par b seul simplement parce qu'il ne donne pas la possibilité d'utiliser la recherche d'index avec "commence par cette chaîne fixe".

Donc, soit :

  • Inclure _reference_1_id dans la requête (probablement non pertinent)
  • OU ajoutez un index sur _reference_2_id (si vous interrogez souvent par champ)
  • OU utilisez un indice

Astuce

Probablement votre option la moins chère en ce moment.

Ajoutez un indice de requête pour forcer l'utilisation de votre _reference_1_id_1__reference_2_id_1_id_1 indice. Ce qui est susceptible d'être beaucoup plus rapide qu'une analyse complète de la table, mais toujours beaucoup plus lent qu'un index qui commence par le champ que vous utilisez dans la requête.

c'est-à-dire

db.mycoll
    .find({"_reference_2_id" : ObjectId("jkl7890123456")})
    .hint("_reference_1_id_1__reference_2_id_1_id_1");