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

Comprendre les index MongoDB

Parmi les tâches impliquées dans la gestion de la base de données, il y a l'amélioration des performances en utilisant différentes stratégies. L'indexation est l'une des astuces qui améliorent les opérations de débit en facilitant l'accès aux données pour les demandes de requête. Pour ce faire, il minimise le nombre d'accès au disque requis lors du traitement d'une requête. Le fait de ne pas utiliser les index dans MongoDB forcera la base de données à effectuer une analyse complète de la collection, c'est-à-dire à parcourir tous les documents de la collection afin de sélectionner les documents correspondant à une instruction de requête émise. Évidemment, cela prendra beaucoup de temps, surtout s'il y a autant de documents impliqués. En un mot, les index permettent une exécution efficace des requêtes.

Index MongoDB

Étant donné que nous prévoyons de stocker de nombreux documents dans une collection MongoDB, nous devons trouver un moyen de stocker une petite partie des données de chaque document dans une partition différente pour faciliter la traversée à l'aide d'index. Un index stockera une ou plusieurs valeurs de champ spécifiques, puis triera ces données dans l'ordre de la valeur de ce champ. Avec cet ordre, la mise en correspondance efficace des requêtes et les opérations de requête basées sur la plage sont prises en charge. Les index sont définis au niveau de la collection et ils sont pris en charge par n'importe quel champ ou champ intégré des documents de la collection.

Lorsque vous créez un document, MongoDB attribue par défaut un champ _id s'il n'est pas spécifié et en fait un index unique pour ce document. Fondamentalement, c'est pour empêcher l'insertion du même document plus de ceux dans cette collection. De plus, pour un cluster partitionné, il est conseillé d'utiliser ce champ _id dans le cadre de la sélection des clés de partition, sinon il doit y avoir une certaine unicité des données dans le champ _id afin d'éviter les erreurs.

Créer un index pour une collection

En supposant que vous avez inséré des données dans votre collection et que vous souhaitez affecter un champ à un index, vous pouvez utiliser la méthode createIndex pour y parvenir, c'est-à-dire

Disons que vous avez ces données JSON :

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Nous pouvons faire du champ Nom un index décroissant en :

db.collection.createIndex({Name: -1})

Cette méthode crée un index avec la même spécification s'il n'existe pas déjà.

Types d'index dans MongoDB

MongoDB implique différents types de données, donc différents types d'index sont dérivés pour prendre en charge ces types de données et ces requêtes.

  1. Champ unique

    En utilisant un seul champ d'un document, on peut faire du champ un index de manière ascendante ou descendante, comme dans l'exemple ci-dessus. De plus, vous pouvez créer un index sur un document intégré dans son ensemble, par exemple :

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    Le champ Contact est un document intégré, nous pouvons donc en faire un index ascendant avec la commande :

    db.collection.createIndex({ Contact: 1})

    Dans une requête, nous pouvons récupérer le document comme :

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    Une bonne pratique consiste à créer l'index en arrière-plan, en particulier lorsqu'une grande quantité de données est impliquée, car l'application doit accéder aux données lors de la création de l'index.

  2. Indice composé

    Les index composés sont souvent utilisés pour faciliter l'opération de tri dans une requête et prendre en charge les requêtes qui correspondent à plusieurs champs. La syntaxe pour créer un index composé est :

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Création d'un index composé pour les exemples de données ci-dessous

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Considérations :

    • Une limite de 32 champs seulement peut être prise en charge.
    • La valeur du champ définira le type d'index, c'est-à-dire que 1 est croissant et -1 est décroissant.
    • Ne créez pas d'index composés qui ont un type d'index haché.
    • L'ordre des champs répertoriés dans un index composé est important. Le tri se fera selon l'ordre des champs.
  3. Index multi-clé

    À un moment donné, vous pouvez avoir des champs avec un contenu de tableau stocké. Lorsque ces champs sont indexés, des entrées d'index distinctes pour chaque élément sont créées. Il aide donc une requête à sélectionner des documents constitués de tableaux en faisant correspondre un élément ou des éléments des tableaux. Ceci est fait automatiquement par MongoDB, il n'est donc pas nécessaire de spécifier explicitement le type multiclé. À partir de la version 3.4, MongoDB suit les champs indexés qui font qu'un index est un index multiclé. Avec ce suivi, le moteur de requête de la base de données est autorisé à utiliser des limites d'index plus strictes.

    Limitations de l'index multiclé

    • Un seul champ de tableau peut être utilisé dans l'indexation multiclé pour un document de la collection. C'est à dire. Vous ne pouvez pas créer d'index multiclé pour la commande et les données sous
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Vous ne pouvez pas créer un index multiclé
      { nums: 1, scores: 1 } 
    • Si l'index multiclé existe déjà, vous ne pouvez pas insérer un document qui enfreint cette restriction. C'est-à-dire si nous avons
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Après avoir créé un index multiclé composé, une tentative d'insertion d'un document dans lequel les champs de nombres et de scores sont des tableaux, la base de données échouera l'insertion.
  4. Index de texte

    Les index de texte sont souvent utilisés pour améliorer les requêtes de recherche d'une chaîne dans une collection. Ils ne stockent pas les mots vides spécifiques à la langue (c'est-à-dire "le", "un", "ou"). Une collection peut avoir au plus un index de texte. Pour créer un index de texte :

    db.collection.createIndex({Name:”text”})

    Vous pouvez également indexer plusieurs champs, c'est-à-dire

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Un index composé peut inclure une clé d'index de texte en combinaison avec la clé d'index ascendant/descendant mais :

    • Toutes les clés d'index de texte doivent être adjacentes dans le document de spécification d'index lors de la création d'un index de texte composé.
    • Aucun autre type d'index spécial, tel que les champs d'index à plusieurs clés, ne doit être impliqué dans l'index de texte composé.
    • Pour effectuer une recherche $text, le prédicat de la requête doit inclure des conditions de correspondance d'égalité sur les clés précédentes.
  5. Index hachés

    Le sharding est l'une des techniques utilisées dans MongoDB pour améliorer la mise à l'échelle horizontale. Le sharding implique souvent un concept basé sur le hachage en utilisant des index hachés. La distribution plus aléatoire des valeurs le long de leur plage est représentée par ces index, mais ne prend en charge que les correspondances d'égalité et ne peut pas prendre en charge les requêtes basées sur la plage.

Considérations opérationnelles générales pour les index

  • Chaque index nécessite au moins 8 Ko d'espace de données.
  • Lorsqu'il est actif, chaque index consommera de l'espace disque et de la mémoire. Ceci est important lorsqu'il est suivi dans la planification des capacités.
  • Pour une collection à ratio lecture/écriture élevé, des index supplémentaires améliorent les performances et n'affectent pas les opérations de lecture non indexées.

Limites de l'utilisation des index

  • L'ajout d'un index a un impact négatif sur les performances des opérations d'écriture, en particulier pour les collections avec un rapport écriture/lecture élevé. Les index seront coûteux dans la mesure où chaque insertion doit également mettre à jour n'importe quel index.
  • MongoDB ne créera pas, ne mettra pas à jour un index ou n'insérera pas dans une collection indexée si l'entrée d'index d'un document existant dépasse la limite de clé d'index.
  • Pour les collections partitionnées existantes, la migration de bloc échouera si le bloc contient un document contenant un champ indexé dont l'entrée d'index dépasse la limite de clé d'index.

Conclusion

Il existe de nombreuses façons d'améliorer les performances de MongoDB, l'indexation étant l'une d'entre elles. L'indexation facilite les opérations de requête en réduisant la latence pendant laquelle les données sont récupérées en minimisant d'une manière ou d'une autre le nombre de documents à numériser. Cependant, certaines considérations doivent être prises en compte avant de décider d'utiliser un type d'index spécifique. Les collections avec un rapport lecture/écriture élevé ont tendance à mieux utiliser les index que les collections avec un nombre élevé d'opérations écriture/lecture.