Présentation des index

Cette page décrit l'indexation pour Cloud Firestore. Cloud Firestore ne crée aucun index par défaut. Pour améliorer les performances de la base de données, créez des index pour vos requêtes les plus courantes.

Les index ont un impact important sur les performances d'une base de données. Si un index existe pour une requête, la base de données peut renvoyer efficacement les résultats en réduisant la quantité de données à analyser et en réduisant le travail nécessaire pour trier les résultats. Cependant, les entrées d'index augmentent les coûts de stockage et la quantité de travail effectuée lors d'une opération d'écriture sur des champs indexés.

Définition et structure des index

Un index se compose des éléments suivants :

  • un ID de collection ;
  • Liste des champs de la collection donnée
  • un ordre (croissant ou décroissant) pour chaque champ.

Un index peut également activer les options sparse, multikey ou unique.

Ordre des index

L'ordre et le sens de tri de chaque champ définissent l'index de manière unique. Par exemple, les index suivants sont deux index distincts et ne sont pas interchangeables :

Collection Champs
villes country (ordre croissant), population (ordre décroissant)
villes population (ordre décroissant), pays (ordre croissant),

Lorsque vous créez un index pour prendre en charge une requête, incluez les champs dans le même ordre que votre requête.

Densité de l'index

Par défaut, les entrées d'index stockent les données de tous les documents d'une collection. C'est ce qu'on appelle un index non creux. Une entrée d'index sera ajoutée pour un document, que celui-ci contienne ou non l'un des champs spécifiés dans l'index. Les champs inexistants sont traités comme ayant une valeur NULL lors de la génération des entrées d'index. Pour modifier ce comportement, vous pouvez définir l'index comme un index creux.

Index creux

Un index à faible densité n'indexe que les documents de la collection contenant une valeur (y compris nulle) pour au moins l'un des champs indexés. Un index creux réduit les coûts de stockage et peut améliorer les performances.

Index multiclés pour les valeurs de tableau

Si vous créez un index sur un champ contenant des valeurs de tableau, vous devez créer un index multiclés. Un index standard ne peut pas indexer les valeurs de tableau. Un index multiclés accepte jusqu'à un champ de tableau dans la définition de l'index et peut être utilisé pour les opérations qui parcourent les valeurs de tableau.

N'utilisez des index multiclés que si vous savez que vous devez indexer des valeurs de tableau. Les index standards présentent des avantages lors du traitement d'une requête. Par exemple, les index standards peuvent filtrer les valeurs d'une plage plus efficacement.

Les situations suivantes entraînent des erreurs lorsque vous travaillez avec des valeurs de tableau et des index multiclés :

  • Une opération tente d'ajouter une valeur de tableau à un champ indexé par un index standard. Pour ajouter la valeur du tableau, vous devez supprimer les index standards existants sur ce champ et les recréer en tant qu'index multiclés.
  • Vous essayez de créer un index standard sur un champ contenant une valeur de tableau. Vous devez créer un index multiclés ou supprimer les valeurs de tableau.
  • Une opération tente d'indexer plusieurs champs avec des valeurs de tableau. Vous ne pouvez pas avoir plus d'un champ avec une valeur de tableau dans un index multiclés. Pour continuer, modifiez votre modèle de données ou vos définitions d'index.
  • Vous essayez de créer un index multiclés dans lequel deux chemins d'accès de champ partagent un préfixe commun, tel que users.posts et users.zip.

Index uniques

Définissez l'option d'index unique pour appliquer des valeurs uniques aux champs indexés. Pour les index sur plusieurs champs, chaque combinaison de valeurs doit être unique dans l'index. La base de données rejette toutes les opérations de mise à jour et d'insertion qui tentent de créer des entrées d'index avec des valeurs en double. Si les données des champs indexés contiennent des valeurs en double et que vous tentez de créer un index unique, la compilation de l'index échoue et un message d'erreur s'affiche dans les détails de l'opération.

Champs absents dans un index unique

Si vous insérez un document avec des champs manquants pour l'index unique, l'index définit des valeurs null pour les champs manquants. L'entrée d'index obtenue doit être unique, sinon l'opération échoue.

Par exemple, avec cet index :

db.cities.createIndex( { "name": 1 }, { unique: true } )

Si vous ajoutez le document {"abbreviation": "LA"} à la collection, l'index unique crée une entrée avec name défini sur null. Si vous essayez ensuite d'ajouter le document {"abbreviation": "NYC"}, l'opération échoue, car l'entrée obtenue pour l'index unique est la même.

Le même comportement s'applique aux index uniques comportant plusieurs champs. Lors de la création ou de la mise à jour d'un document, les champs indexés manquants sont définis sur null, et l'entrée d'index obtenue doit être unique dans l'index.

Index uniques sur les valeurs de tableau

Un index multiclés unique peut être utilisé pour s'assurer que les documents ne contiennent pas d'éléments de tableau qui se chevauchent.

Ce type d'index n'impose pas qu'un tableau comporte des valeurs uniques dans un même document.

Par exemple, avec un index unique :

db.collection.createIndex( { "tags": 1 }, { unique: true } )

Le document suivant peut être inséré :

{
  "_id": 1,
  "tags": [ "news", "tech", "news", "music" ]
}

L'index autorise les valeurs en double ("news") dans le même tableau d'un même document.

Si vous tentez d'insérer un deuxième document avec un élément en double, l'opération échoue :

{
  "_id": 2,
  "tags": [ "sports", "music" ]
}

L'opération échoue, car "music" est déjà présent dans le tableau du document 1 et mappé dans l'index.

Si vous devez vous assurer que les éléments d'un même tableau dans un seul document sont uniques, gérez cela dans la logique de votre application en utilisant des opérateurs de mise à jour tels que $addToSet au lieu de $push.

Tableaux vides, champs manquants et valeurs nulles

Normalement, les champs manquants dans un index unique sont traités comme null et doivent être uniques dans tous les documents (voir Champs absents dans un index unique). Toutefois, pour les index uniques sur les champs de tableau :

  • Tableaux vides, champs manquants et valeurs nulles autonomes : si le champ de tableau est vide, complètement manquant ou contient une valeur null autonome (pas dans un tableau), aucune clé d'index n'est générée pour le document. Par conséquent, plusieurs documents peuvent comporter des champs vides ou des valeurs null autonomes sans déclencher d'erreurs de clé en double.
  • Éléments nuls dans un tableau : si le tableau contient une valeur null en tant qu'élément (par exemple, ["news", null]), l'élément null est indexé. Tout document ultérieur contenant un élément null dans son champ de tableau indexé échouera avec une erreur de clé en double.

Index TTL

Utilisez des index TTL pour supprimer automatiquement les données obsolètes de vos bases de données. Un index TTL désigne un champ donné comme délai d'expiration des documents d'une collection donnée. Avec la valeur TTL, vous pouvez réduire les coûts de stockage en nettoyant les données obsolètes. Les données sont généralement supprimées dans les 24 heures suivant leur date d'expiration.

Résoudre les erreurs de compilation d'index

Vous pouvez rencontrer des erreurs de compilation d'index lors de la gestion de vos index. Une opération d'indexation peut échouer si la base de données rencontre un problème avec les données. Les opérations d'indexation peuvent échouer pour les raisons suivantes :

  • Vous avez atteint une limite d'index. Par exemple, l'opération a peut-être atteint le nombre maximal d'entrées d'index par document. Si la création de l'index échoue, un message d'erreur s'affiche. Si vous n'avez pas atteint la limite d'index, relancez l'opération d'indexation.
  • Un index multiclés est requis. Au moins l'un des champs indexés contient une valeur de tableau. Pour continuer, vous devez utiliser un index multiclés ou supprimer les valeurs du tableau.
  • Une opération tente d'indexer plusieurs champs avec des valeurs de tableau. Vous ne pouvez pas avoir plus d'un champ avec une valeur de tableau dans un index multiclés. Pour continuer, modifiez votre modèle de données ou vos définitions d'index.
  • Vous avez défini l'option d'index unique, et les données des champs indexés créeraient des entrées d'index en double. Pour continuer, supprimez les combinaisons de valeurs en double des données.

Étape suivante