Quelques points clés de la sortie du plan d'explication :
- La requête porte sur les attributs suivants :
siteId, status, creationDate, reportCount, assignee, parent
- Le plan gagnant comporte deux étapes :
- IX_SCAN utilise
creationDate_1_reportCount_1_label_1
, cela utilise des recherches indexées surcreationDate
etreportCount
pour identifier 56 documents qui sont ensuite transmis à l'étape FETCH - FETCH reçoit 56 documents de l'étape IX_SCAN, puis interroge ces documents pour appliquer le
siteId
,status
,assignee
etparent
filtres. Cette interrogation entraîne le rejet de 37 documents, ce qui entraîne le retour de 19 documents.
- IX_SCAN utilise
Ainsi, votre index ne couvre que 2 des 6 attributs de votre requête et les 4 attributs restants de votre requête sont appliqués en examinant les documents pas l'index . Si vous souhaitez que cette requête soit entièrement couverte par l'index, créez l'index suivant :
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Si vous exécutez avec cet index en place, vous devriez constater que (a) MongoDB choisit cet index et (b) le nombre de documents transmis par l'étape IX_SCAN est le même que le nombre de documents renvoyés par votre appel de recherche.
Je dis "devrait trouver" car il y a d'autres aspects ici qui pourraient amener MongoDB à choisir un index différent, par ex. utilisation de $nor
et l'étape de tri (creationDate: 1
). Je recommanderais de peaufiner l'index et d'exécuter avec expliquer 'on' après chaque ajustement et de rechercher ces éléments clés dans le executionStats
sous-document :
- "nRetourné"
- "totalKeysExamined"
- "totalDocsExamined"
Une règle simple est la suivante :plus totalKeysExamined
est proche est à nReturned
et plus totalDocsExamined
se rapproche est à zéro ... meilleure est la couverture de votre index.
Il y a aussi la question du coût d'un index (en termes d'impact sur les temps d'écriture et le stockage de l'index), je suggérerais donc de prendre en compte vos exigences non fonctionnelles - les temps écoulés souhaités peuvent-ils être atteints sans une couverture complète de l'index ? Si ce n'est pas le cas, vous devez procéder à des tests empiriques, mais soyez prêt à modifier votre choix en réponse à ce que le explain()
sortie vous dit.