Par la mangouste documentation pour MongooseJS
et MongoDB
/Node.js
:
Au démarrage de votre application, Mongoose appelle automatiquement
ensureIndex
pour chaque index défini dans votre schéma. Bien qu'il soit agréable pour le développement, il est recommandé de désactiver ce comportement en production car la création d'index peut avoir un impact significatif sur les performances. Désactivez le comportement en définissant l'optionautoIndex
de votre schéma sur false.
Cela semble indiquer la suppression de l'indexation automatique de mangouste avant le déploiement pour optimiser Mongoose de demander à Mongo d'aller parcourir tous les index au démarrage de l'application, ce qui semble logique.
Quelle est la bonne façon de gérer l'indexation dans le code de production? Peut-être qu'un script externe devrait générer des index? Ou peut-être que ensureIndex
n'est pas nécessaire si une seule application est le seul lecteur/écrivain d'une collection, car elle continuera un index chaque fois qu'une écriture de base de données se produira?
Edit: Pour compléter, MongoDB fournit une bonne documentation pour le comment pour faire l'indexation, mais pas pourquoi ou quand des directives d'indexation explicites doivent être effectuées. Il me semble que les index devraient être tenus à jour par les applications d'écriture automatiquement sur les collections avec des index existants et que ensureIndex
est vraiment plus une chose ponctuelle (fait quand un nouvel index est appliqué), dans auquel cas autoIndex
de Mongoose devrait être un no-op lors d'un redémarrage normal du serveur.
Je n'ai jamais compris pourquoi la documentation Mongoose recommande si largement de désactiver autoIndex
en production. Une fois l'index ajouté, les appels ensureIndex
suivants verront simplement que l'index existe déjà, puis reviendront. Cela n'a donc d'effet sur les performances que lors de la première création de l'index, et à ce moment-là, les collections sont souvent vides, de sorte que la création d'un index serait rapide de toute façon.
Ma suggestion est de laisser autoIndex
activé sauf si vous avez une situation spécifique où cela vous pose des problèmes; comme si vous voulez ajouter un nouvel index à une collection existante qui a des millions de documents et que vous voulez plus de contrôle sur sa création.
Bien que je sois d'accord avec la réponse acceptée, il convient de noter que selon le manuel MongoDB , ce n'est pas la façon recommandée d'ajouter des index sur un serveur de production :
Si votre application comprend des opérations sureIndex () et qu'aucun index n'existe pour d'autres problèmes opérationnels, la création de l'index peut avoir un impact grave sur les performances de la base de données.
Pour éviter les problèmes de performances, assurez-vous que votre application recherche les index au démarrage à l'aide de la méthode getIndexes () ou la méthode équivalente pour votre pilote et se termine si les index appropriés n'existent pas. Créez toujours des index dans les instances de production à l'aide d'un code d'application distinct, pendant les fenêtres de maintenance désignées.
Bien sûr, cela dépend vraiment de la façon dont votre application est structurée et déployée. Si vous déployez sur Heroku, par exemple, et que vous n'utilisez pas la fonction de pré-démarrage de Heroku , il est probable que votre application ne traite pas du tout les demandes lors du démarrage, et il est donc probablement sûr de créer un index à ce moment-là.
En plus de cela, de la réponse acceptée:
Cela n'a donc d'effet sur les performances que lors de la première création de l'index, et à ce moment-là, les collections sont souvent vides, de sorte que la création d'un index serait rapide de toute façon.
Si vous avez réussi à obtenir votre modèle de données et vos requêtes pour la première fois, c'est très bien, et souvent le cas. Cependant, si vous ajoutez de nouvelles fonctionnalités à votre application, avec une nouvelle requête DB sur une propriété sans index, vous vous retrouverez souvent à ajouter un index à une collection contenant de nombreux documents existants.
C'est le moment où vous devez faire attention à l'ajout d'index et considérer attentivement les implications en termes de performances de cette opération. Par exemple, vous pouvez créer l'index en arrière-plan :
db.ensureIndex({ name: 1 }, { background: true });
utilisez ce code de bloc pour gérer le mode de production:
const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });