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

Un aperçu de l'indexation de base de données pour MongoDB

Qu'est-ce que l'indexation ?

L'indexation est un concept important dans le monde des bases de données. Le principal avantage de la création d'un index sur n'importe quel champ est un accès plus rapide aux données. Il optimise le processus de recherche et d'accès à la base de données. Considérez cet exemple pour comprendre cela.

Lorsqu'un utilisateur demande une ligne spécifique de la base de données, que fait le système de base de données ? Il commencera à partir de la première ligne et vérifiera s'il s'agit de la ligne souhaitée par l'utilisateur ? Si oui, renvoyez cette ligne, sinon continuez à chercher la ligne jusqu'à la fin.

Généralement, lorsque vous définissez un index sur un champ particulier, le système de base de données crée une liste ordonnée de la valeur de ce champ et la stocke dans une table différente. Chaque entrée de ce tableau pointera vers les valeurs correspondantes dans le tableau d'origine. Ainsi, lorsque l'utilisateur essaie de rechercher une ligne, il recherche d'abord la valeur dans la table d'index à l'aide d'un algorithme de recherche binaire et renvoie la valeur correspondante à partir de la table d'origine. Ce processus prendra moins de temps car nous utilisons la recherche binaire au lieu de la recherche linéaire.

Dans cet article, nous allons nous concentrer sur l'indexation MongoDB et comprendre comment créer et utiliser des index dans MongoDB.

Comment créer un index dans la collection MongoDB ?

Pour créer un index à l'aide du shell Mongo, vous pouvez utiliser cette syntaxe :

db.collection.createIndex( <key and index type specification>, <options> )

Exemple :

Pour créer un index sur le champ de nom dans la collection myColl :

db.myColl.createIndex( { name: -1 } )

Types d'index MongoDB

  1. Index _id par défaut

    Il s'agit de l'index par défaut qui sera créé par MongoDB lorsque vous créerez une nouvelle collection. Si vous ne spécifiez aucune valeur pour ce champ, alors _id sera la clé primaire par défaut pour votre collection afin qu'un utilisateur ne puisse pas insérer deux documents avec les mêmes valeurs de champ _id. Vous ne pouvez pas supprimer cet index du champ _id.

  2. Index de champ unique

    Vous pouvez utiliser ce type d'index lorsque vous souhaitez créer un nouvel index sur n'importe quel champ autre que le champ _id.

    Exemple :

    db.myColl.createIndex( { name: 1 } )

    Cela créera un index ascendant à clé unique sur le champ de nom dans la collection myColl

  3. Indice composé

    Vous pouvez également créer un index sur plusieurs champs à l'aide d'index composés. Pour cet index, l'ordre des champs dans lesquels ils sont définis dans l'index est important. Prenons cet exemple :

    db.myColl.createIndex({ name: 1, score: -1 })

    Cet index triera d'abord la collection par nom dans l'ordre croissant, puis pour chaque valeur de nom, il triera par valeurs de score dans l'ordre décroissant.

  4. Index multi-clé

    Cet index peut être utilisé pour indexer les données du tableau. Si un champ d'une collection a un tableau comme valeur, vous pouvez utiliser cet index qui créera des entrées d'index distinctes pour chaque élément du tableau. Si le champ indexé est un tableau, MongoDB créera automatiquement un index multiclé dessus.

    Prenons cet exemple :

    {
    ‘userid’: 1,
    ‘name’: ‘mongo’,
    ‘addr’: [
        {zip: 12345, ...},
    {zip: 34567, ...}
    ]
    }

    Vous pouvez créer un index multiclé sur le champ addr en exécutant cette commande dans le shell Mongo.

    db.myColl.createIndex({ addr.zip: 1 })
  5. Index géospatial

    Supposons que vous ayez stocké des coordonnées dans la collection MongoDB. Pour créer un index sur ce type de champs (qui contient des données géospatiales), vous pouvez utiliser un index géospatial. MongoDB prend en charge deux types d'index géospatiaux.

    • Index 2d :vous pouvez utiliser cet index pour les données stockées sous forme de points sur le plan 2D.

      db.collection.createIndex( { <location field> : "2d" } )
    • Index 2dsphere :utilisez cet index lorsque vos données sont stockées au format GeoJson ou en paires de coordonnées (longitude, latitude)

    db.collection.createIndex( { <location field> : "2dsphere" } )
  6. Index de texte

    Pour prendre en charge les requêtes qui incluent la recherche de texte dans la collection, vous pouvez utiliser l'index de texte.

    Exemple :

    db.myColl.createIndex( { address: "text" } )
  7. Index haché

    MongoDB prend en charge le partage basé sur le hachage. L'index haché calcule le hachage des valeurs du champ indexé. L'index haché prend en charge le partitionnement à l'aide de clés fragmentées hachées. Le partage haché utilise cet index comme clé de partition pour partitionner les données sur votre cluster.

    Exemple :

    db.myColl.createIndex( { _id: "hashed" } )
Propriétés de l'indice
  1. Index unique

    Cette propriété garantit qu'il n'y a pas de valeurs en double dans le champ indexé. Si des doublons sont trouvés lors de la création de l'index, il supprimera ces entrées.

  2. Index fragmenté

    Cette propriété garantit que toutes les requêtes recherchent des documents avec un champ indexé. Si un document n'a pas de champ indexé, il sera supprimé du jeu de résultats.

  3. Indice TTL

    Cet index est utilisé pour supprimer automatiquement les documents d'une collection après un intervalle de temps spécifique (TTL). C'est idéal pour supprimer les documents des journaux d'événements ou des sessions utilisateur.

Analyse des performances

Considérons une collection de notes d'élèves. Il contient exactement 3000000 documents. Nous n'avons créé aucun index dans cette collection. Voir cette image ci-dessous pour comprendre le schéma.

Exemples de documents dans la collection de partitions

Maintenant, considérez cette requête sans aucun index :

db.scores.find({ student: 585534 }).explain("executionStats")

Cette requête prend 1155 ms pour s'exécuter. Voici la sortie. Recherchez le champ executionTimeMillis pour le résultat.

Temps d'exécution sans indexation

Créons maintenant un index sur le champ étudiant. Pour créer l'index, exécutez cette requête.

db.scores.createIndex({ student: 1 })

Maintenant, la même requête prend 0 ms.

Temps d'exécution avec indexation

Vous pouvez clairement voir la différence de temps d'exécution. C'est presque instantané. C'est le pouvoir de l'indexation.

Conclusion

Un point à retenir évident est :créer des index. En fonction de vos requêtes, vous pouvez définir différents types d'index sur vos collections. Si vous ne créez pas d'index, chaque requête analysera les collections complètes, ce qui prend beaucoup de temps, ce qui rend votre application très lente et utilise beaucoup de ressources de votre serveur. D'autre part, ne créez pas trop d'index non plus, car la création d'index inutiles entraînera une surcharge de temps supplémentaire pour toutes les insertions, suppressions et mises à jour. Lorsque vous effectuez l'une de ces opérations sur un champ indexé, vous devez également effectuer la même opération sur l'arborescence d'index, ce qui prend du temps. Les index sont stockés dans la RAM, de sorte que la création d'index non pertinents peut consommer votre espace RAM et ralentir votre serveur.