Gérer les index

Firestore garantit les performances des requêtes en exigeant un index pour chaque requête. Les index requis pour les requêtes les plus élémentaires sont créés automatiquement pour vous. Lorsque vous utilisez et testez votre application, Cloud Firestore génère des messages d'erreur qui vous aident à créer des index supplémentaires requis par votre application. Cette page explique comment gérer les index de champs individuels et les index composites.

Créer un index manquant via un message d'erreur

Si vous tentez d'effectuer une requête composée avec une clause de plage qui ne correspond pas à un index existant, vous recevez une erreur. Le message d'erreur comprend un lien direct qui permet de créer l'index manquant dans la console Firebase.

Cliquez sur le lien généré vers la console Firebase, consultez les informations automatiquement renseignées et cliquez sur Créer.

Utiliser la console Google Cloud Platform

Dans la console Google Cloud Platform, vous pouvez gérer les exceptions d'indexation des champs individuels et les index composites.

Créer un index composite

Pour créer manuellement un index composite à partir de la console GCP, procédez comme suit :

  1. Accédez à la section Index composites.

    Accéder à la section Index composites

  2. Cliquez sur Créer un index.

  3. Saisissez un ID de collection. Ajoutez les noms des champs que vous souhaitez indexer et un mode d'indexation pour chaque champ. Cliquez sur Enregistrer l'index.

Votre nouvel index apparaît dans la liste des index composites et Firestore commence à le créer. Une fois que votre index est créé, une coche verte apparaît à côté de l'index.

Supprimer un index composite

Pour supprimer un index composite, procédez comme suit :

  1. Accédez à la section Index composites.

    Accéder à la section Index composites

  2. Dans la liste de vos index composites, cliquez sur l'entrée de l'index que vous souhaitez supprimer. Cliquez sur Supprimer.

  3. Confirmez que vous souhaitez supprimer cet index en cliquant sur Supprimer l'index dans l'alerte.

Ajouter une exception d'index de champs individuels

Les exceptions d'index de champs individuels vous permettent de remplacer les paramètres d'index automatiques pour des champs spécifiques d'une collection. Vous pouvez ajouter des exceptions de champs individuels depuis la console :

  1. Accédez à la section Index de champs individuels.

    Accéder à la section Index de champs individuels

  2. Cliquez sur Ajouter une exception.

  3. Saisissez un ID de collection et le chemin d'accès au champ.

  4. Sélectionnez les nouveaux paramètres d'indexation pour ce champ. Activer ou désactiver la mise à jour automatique des paramètres "ascendant", "descendant" et "le tableau contient" des index de champs individuels pour ce champ.

  5. Cliquez sur Enregistrer les exceptions.

Supprimer une exception d'index de champs individuels

Pour supprimer une exception d'index de champs individuels, procédez comme suit :

  1. Dans le lecteur Firestore, accédez à la section Index à champ unique.

    Accéder à la section Index de champs individuels

  2. Cliquez sur Ajouter une exception.

  3. Saisissez un ID de collection et un nom de champ.

  4. Dans votre liste d'exceptions d'index de champs individuels, cliquez sur l'entrée correspondant à l'exception que vous souhaitez supprimer. Cliquez sur Supprimer.

  5. Confirmez que vous souhaitez supprimer cette exception en cliquant sur Supprimer l'exception dans l'alerte.

Lorsque vous supprimez une exception de champ individuel, le champ ou le sous-champ spécifié utilise les paramètres d'indexation hérités. Les champs de document rétablissent les paramètres d'indexation automatiques de votre base de données. Les sous-champs d'une carte héritent des exceptions sur les champs parents avant d'hériter des paramètres d'indexation automatiques.

Utiliser la CLI Firebase

Vous pouvez également déployer des index avec la CLI Firebase. Pour commencer, exécutez firebase init firestore dans le répertoire de votre projet. Lors de la configuration, la CLI Firebase génère un fichier JSON avec les index par défaut au format approprié. Modifiez le fichier pour ajouter d'autres index et déployez-le avec la commande firebase deploy. Si vous ne souhaitez déployer que des index, ajoutez l'indicateur --only firestore:indexes. Si vous modifiez les index via la console Firebase, assurez-vous de mettre à jour votre fichier d'index local. Consultez la documentation de référence sur la définition de l'index JSON.

Temps de création d'un index

Pour créer un index, Firestore doit configurer l'index, puis remplir l'index avec les données existantes. La durée de création de l'index correspond à la somme des temps de configuration et de remplissage :

  • La configuration d'un index prend quelques minutes. La durée minimale de création d'un index est de quelques minutes, même pour une base de données vide.

  • Le délai de remplissage dépend de la quantité de données existantes qui appartiennent au nouvel index. Plus les valeurs de champs correspondant à la définition de l'index sont nombreuses, plus le remplissage de l'index prend du temps.

Les créations d'index sont des opérations de longue durée.

Une fois que vous avez lancé la création d'un index, Firestore attribue à l'opération un nom unique. Les noms des opérations sont précédés du préfixe projects/[PROJECT_ID]/databases/(default)/operations/, par exemple :

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Cependant, vous pouvez omettre le préfixe lorsque vous spécifiez un nom d'opération pour la commande describe.

Répertorier toutes les opérations de longue durée

Pour répertorier les opérations de longue durée, exécutez la commande gcloud firestore operations list. Cette commande répertorie les opérations en cours et récemment terminées. Une fois terminées, les opérations restent accessibles pendant quelques jours :

gcloud firestore operations list

Vérifier l'état de l'opération

Au lieu de répertorier toutes les opérations de longue durée, vous pouvez répertorier les détails d'une seule opération :

gcloud firestore operations describe operation-name

Estimation du délai d'exécution

Lorsque l'opération s'exécute, consultez la valeur du champ state pour connaître son état global.

Une requête permettant d'obtenir l'état d'une opération de longue durée renvoie les métriques workEstimated et workCompleted. Ces métriques sont renvoyées pour le nombre de documents. workEstimated indique le nombre total estimé de documents qu'une opération va traiter. workCompleted indique le nombre de documents traités jusqu'à présent. Une fois l'opération terminée, workCompleted reflète le nombre total de documents réellement traités, qui peut être différent de la valeur de workEstimated.

Divisez workCompleted par workEstimated pour obtenir une estimation approximative de la progression. L'estimation peut être inexacte, car elle dépend de la collecte de statistiques retardée.

Par exemple, voici l'état de la progression d'une compilation d'index :

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

Lorsqu'une opération est terminée, la description de l'opération contient "done": true. Consultez la valeur du champ state pour afficher le résultat de l'opération. Si le champ done n'est pas défini dans la réponse, sa valeur est false. Ne vous basez pas sur l'existence de la valeur done pour les opérations en cours.

Erreurs de création d'index

Vous risquez de rencontrer des erreurs lorsque vous gérez des index composites et des exceptions d'index de champs individuels. Une opération d'indexation peut échouer si Firestore rencontre un problème avec les données qu'il est en train d'indexer. Le plus souvent, cela signifie que vous avez atteint une limite d'index. Par exemple, l'opération peut avoir atteint le nombre maximal d'entrées d'index par document.

Si la création de l'index échoue, le message d'erreur s'affiche dans la console. Après avoir vérifié que vous n'atteignez aucune limite d'index, essayez à nouveau.