Il est bien connu que les ressources sont très limitées dans les environnements de production et qu'il est vrai qu'il existe aujourd'hui des serveurs dix fois plus puissants que ceux qui existaient il y a 5 ans, cependant, au fur et à mesure que la puissance de ces ordinateurs a augmenté, la question de Les données.
En fonction du temps d'exécution d'une requête, nous pouvons dire si elle est critique ou non, cependant, même si elle n'est pas critique, il y a toujours une petite marge d'amélioration, avec cela nous économiserons des secondes d'exécution qu'au fin de journée sont transformés en minutes , ce qui nous donne la possibilité d'améliorer l'expérience utilisateur.
ExigencesAfin de réaliser ce tutoriel, nous avons besoin d'une installation fonctionnelle de MongoDB avec des autorisations suffisantes pour que nous puissions travailler dans la console de commande.
Nous avons également besoin d'un ensemble de données ou documents Pour remplir notre collection, dans les didacticiels précédents, nous avons proposé un premier ensemble de données, mais pour ceux qui ne l'ont pas, ils peuvent l'utiliser :
db.guiamongo.insert ({"name": "Maria", "age": "25", "gender": "Femme", "country": "Colombie"}); db.guiamongo.insert ({"name ":" Pedro "," age ":" 32 "," gender ":" Homme "," country ":" Equateur "}); db.guiamongo.insert ({" name ":" Ramon "," age " : "18", "gender": "Homme", "pays": "Honduras"}); db.guiamongo.insert ({"name": "John", "age": "22", "gender": "Homme", "pays": "Argentine"}); db.guiamongo.insert ({"nom": "Rosa", "âge": "45", "genre": "Femme", "pays": " Chili "," langues": [" Esp "," Ing "," Fra "]});Avec cela nous en aurons assez pour un petit départ et ainsi obtenir des résultats des exercices que nous présenterons ci-dessous.
1. Indexation de MongoDB
L'indexation ou l'utilisation des index est un concept partagé dans MongoDB avec les Base de données relationnel, c'est-à-dire que si nous avons une notion de ce concept, nous pouvons comprendre comment il fonctionne dans MongoDB avant longtemps, nous devons simplement nous en tenir à la syntaxe particulière.
Travailler avec des indexSi nous sommes étrangers au concept, il convient de noter que travailler avec indices n'est rien de plus que de préciser au Base de données quels champs vous devez utiliser en mémoire pour rendre votre recherche plus efficace, par exemple si nous interrogeons une grande collection de documents pour un champ appelé nom, l'idéal serait d'indexer ce champ pour que le moteur sache qu'il doit être guidé directement par ce champ, ce faisant les requêtes qui utilisent ce champ commencent à être plus rapides.
Pour créer un index sur MongoDB ce que nous devrions faire est d'utiliser la fonction assurerIndex() et en paramètre passer un document JSON indiquant les champs ou propriétés de notre document auxquels nous devons conformer ledit index. Regardons un petit exemple de cela.
Supposons que nous ayons une collection appelée guiamongo et nous faisons une recherche pour un champ appelé nom, le code serait le suivant :
db.guiamongo.find ({« nom » : « nom »})C'est une requête normale qui n'a rien de particulier, le seul problème est que s'il y a des millions de documents ce serait très lent, donc pour créer un index il suffit de le spécifier comme suit :
db.guiamongo.ensureIndex ({« nom » : 1})Avec cela, nous avons déjà créé l'index pour la requête, si nous l'exécutons à nouveau, ce sera beaucoup plus rapide. Voyons à quoi cela ressemble sur notre console MongoDB:
On peut remarquer qu'une fois l'index créé, MongoDB Il nous renvoie un document où il indique l'état de notre fonction et combien d'index nous avions avant et après l'application, nous montrant en plus le champ d'accord à 1 qui indique que l'exécution a réussi.
La requête précédente est assez utile pour un seul champ mais si nous procédons comme suit :
db.guiamongo.find ({"name": "Name", "age": {"$ gt": "20"}}).sort ({"age": - 1});On se rend compte que dans ce cas le indice Le précédent ne fonctionne plus, c'est parce que la requête utilise une combinaison différente de champs pour la recherche, c'est pourquoi nous devons créer un nouvel index en utilisant ce que nous avons appris précédemment, voyons comment ce serait :
db.guiamongo.ensureIndex ("nom": 1, "âge": 1);Maintenant, si nous vérifions notre base de données comme suit, nous verrons que nous avons un nouvel index dans la collection :
2. Inconvénient dans l'utilisation des index
Malgré les grands avantages que l'utilisation et le travail avec indicesCelles-ci ne sont pas toujours bénéfiques, c'est pourquoi nous devons analyser en profondeur avant d'implémenter cette fonctionnalité dans notre base de données.
Plus gros inconvénientLa grand inconvénient dans l'utilisation des index est que le moteur doit intégrer les nouvelles données que nous insérons dans la table ou la liste des index, pour cette raison à chaque fois qu'une fonction est faite insérer () un certain nombre de processus adjacents seront créés qui peuvent augmenter l'utilisation du disque et du traitement.
Un autre inconvénient est que nous avons un maximum de 64 index par collection, C'est pourquoi nous devons travailler avec le moins d'entre eux possible dans notre base de données, garantissant ainsi que seul ce qui est strictement nécessaire est ce qui est utilisé.
3. Comment savoir quand utiliser un index
Puisque nous connaissons les restrictions et les inconvénients de l'utilisation des index, un bon exercice pour savoir si nous devons les créer ou non est de répondre à cette série de questions, si nous pouvons y répondre nous avons les caractéristiques nécessaires pour créer un index, sur par contre si on ne peut pas il faudra analyser la situation d'un autre point de vue, regardons les questions :
Quelles requêtes faisons-nous ?Nous devons effectuer une analyse de la situation et voir ce qui se passe dans notre collection, avec cela nous découvrirons si nous avons besoin d'index, ou sinon, peut-être devons-nous en éliminer certains.
Quelle est la bonne orientation des indices ?Nous avons besoin de savoir comment nous ordonnons les données dans les index, si c'est alphabétique ou numérique, ascendant ou descendant, cela influence directement la vitesse d'indexation.
Comment va-t-il évoluer ?Nous devons penser à la croissance de nos données, car ainsi nous saurons si ce qui fonctionne aujourd'hui demain avec 10 ou 100 fois plus de données fonctionnera correctement.
Bien sûr ce n'est qu'un guide, il existe des cas particuliers et très particuliers de chaque administrateur d'application dans lesquels vous devez appliquer vos critères sur ce type de tutoriels, cependant c'est un bon guide pour nous lancer dans le monde de l'optimisation des données.
4. Index dans les documents incorporés
La structure des documents que nous pouvons traiter dans MongoDB se prête à un stockage de données complexe, toutes les données dont nous avons besoin ne seront pas au même niveau, c'est pourquoi la nécessité de créer index de documents incorporés. Avec ces indices MongoDB Vous pourrez indexer des données qui ont des structures plus complexes.
Pour parvenir à un résultat, nous utiliserons ce qu'on appelle le notation par points, qui n'est rien de plus que d'accéder aux champs des documents incorporés comme s'il s'agissait des propriétés d'un objet via un point. Dans l'exemple suivant nous allons créer un index de ces caractéristiques, voyons dans un premier temps la syntaxe.
Nous allons d'abord insérer un enregistrement avec un document intégré dans notre ensemble de données de test :
db.guiamongo.insert ({"nom": "Juan", "âge": "40", "sexe": "Homme", "pays": "Brésil", "qualifications": {"historique": "85 "," littérature ":" 90 "," cours ":" 3 "}});Ensuite, nous allons faire une requête simple dans ce cas pour la propriété cours :
db.guiamongo.find ({"notes.cours": "3"});Maintenant, si nous voulons créer un index, nous devons simplement procéder comme suit :
db.guiamongo.ensureIndex ({« notes.cours » : 1});Avec cela, nous avons déjà créé un index d'un document intégré dans un autre dans une collection dans MongoDB. Si on regarde ça, on aurait dû obtenir en console :
5. Utilisez expliquer ()
Puisque nous savons créer des index et que nous avons une idée de quand et pourquoi nous devons les créer, cependant, nous n'avons pas encore vu d'outil qui soit très important, celui qui nous permette d'en savoir un peu plus et d'aller plus loin dans nos requêtes; on se réfère à Explique () cette fonction permet de connaître l'heure et les index utilisés dans les requêtes.
Que nous dit-il ?Retour de Explique () C'est un document où il indiquera le curseur qu'il utilise pour la recherche, puis il indique les limites de l'index, nous avons également un champ qui porte le nom millièmes et il indiquera le temps en millisecondes qu'une requête prend pour s'exécuter, ce dernier est très important pour comprendre les performances de notre Base de données.
Voyons comment nous pouvons appliquer cette fonction à une requête, nous allons utiliser celle que nous avons faite dans notre exemple précédent :
db.guiamongo.find ({« grades.course » : « 3 »}).expliquer ();Après son application, il devrait renvoyer quelque chose comme ce qui suit :
Nous notons comment des données nous sont proposées pour pouvoir analyser la requête, en le curseur nous voyons que nous avons utilisé l'index que nous avons créé dans l'exercice précédent appelé notes.cours_1, cela nous a aidé à y arriver 0 milliseconde le temps d'exécution, qui est le moment optimal pour nos requêtes, évidemment puisqu'il s'agit d'un environnement de test nous n'aurons pas quelque chose au-delà, mais si nous pouvons faire cet exercice sur des serveurs avec des millions d'enregistrements, nous réaliserons la puissance des index.
Avec cela, nous avons terminé ce tutoriel, nous avons créé indices dans nos collections de documents et en plus nous avons exploré quelques outils qui nous aident à obtenir des informations clés pour améliorer et surtout augmenter les performances de nos Base de données.