Optimiser les performances de la base de données

Il existe plusieurs façons d'améliorer les Firebase Realtime Database performances de votre application. Pour découvrir comment optimiser les Realtime Database performances, collectez des données à l'aide des différents outils de surveillance Realtime Database, puis apportez les modifications nécessaires à votre application ou à votre utilisation Realtime Database.

Surveiller les performances de Realtime Database

Vous pouvez collecter des données sur les performances de votre Realtime Database's à l'aide de quelques outils différents, en fonction du niveau de précision dont vous avez besoin :

  • Vue d'ensemble : utilisez l'outil de profilage pour obtenir la liste des requêtes non indexées et une vue d'ensemble en temps réel des opérations de lecture/écriture.
  • Estimation de l'utilisation facturée : utilisez les métriques d'utilisation disponibles dans la console Firebase pour consulter votre utilisation facturée et les métriques de performances générales.
  • Analyse détaillée : utilisez Cloud Monitoring pour obtenir une vue plus précise des performances de votre base de données au fil du temps.

Améliorer les performances par métrique

Une fois que vous avez collecté des données, explorez les bonnes pratiques et stratégies suivantes en fonction du domaine de performances que vous souhaitez améliorer.

Stratégies d'amélioration des performances en bref
Métrique Description Bonnes pratiques
Charge/Utilisation Optimisez la quantité de capacité de votre base de données utilisée pour traiter les requêtes à un moment donné (reflétée dans les métriques **Charge** ou **io/database_load**). Optimiser la structure des données
Répartir les données sur plusieurs bases de données
Améliorer l'efficacité des écouteurs
Limiter les téléchargements avec des règles basées sur des requêtes
Optimiser les connexions
Connexions actives Équilibrez le nombre de connexions actives simultanées à votre base de données pour ne pas dépasser la limite de 200 000 connexions. Répartir les données sur plusieurs bases de données
Réduire les nouvelles connexions
Bande passante sortante Si les téléchargements de votre base de données semblent plus élevés que souhaité, vous pouvez améliorer l'efficacité de vos opérations de lecture et réduire la surcharge de chiffrement. Optimiser les connexions
Optimiser la structure des données
Limiter les téléchargements avec des règles basées sur des requêtes
Réutiliser les sessions SSL
Améliorer l'efficacité des écouteurs
Restreindre l'accès aux données
Stockage Assurez-vous de ne pas stocker de données inutilisées ou équilibrez vos données stockées sur d'autres bases de données et/ou produits Firebase pour ne pas dépasser le quota. Nettoyer les données inutilisées
Optimiser la structure des données
Répartir les données sur plusieurs bases de données
Utiliser Cloud Storage for Firebase

Optimiser les connexions

Les requêtes RESTful telles que GET et PUT nécessitent toujours une connexion, même si elle est de courte durée. Ces connexions fréquentes et de courte durée peuvent en fait entraîner des coûts de connexion, une charge de base de données et une bande passante sortante beaucoup plus importants que les connexions actives en temps réel à votre base de données.

Dans la mesure du possible, utilisez les SDK natifs pour la plate-forme de votre application, au lieu de l'API REST. Les SDK maintiennent les connexions ouvertes, ce qui réduit les coûts de chiffrement SSL et la charge de base de données qui peuvent s'accumuler avec l'API REST.

Si vous utilisez l'API REST, envisagez d'utiliser un keep-alive HTTP pour maintenir une connexion ouverte ou d'utiliser des événements envoyés par le serveur, ce qui peut réduire les coûts liés aux négociations SSL.

Répartir les données sur plusieurs bases de données

La répartition de vos données sur plusieurs instances Realtime Database, également appelée partitionnement de base de données, offre trois avantages :

  1. Augmentez le nombre total de connexions actives simultanées autorisées sur votre application en les répartissant sur plusieurs instances de base de données.
  2. Équilibrez la charge sur les instances de base de données.
  3. Si vous disposez de groupes d'utilisateurs indépendants qui n'ont besoin d'accéder qu'à des ensembles de données distincts, utilisez différentes instances de base de données pour un débit plus élevé et une latence plus faible.

Si vous disposez du forfait Blaze, vous pouvez créer plusieurs instances de base de données dans le même projet Firebase, en utilisant une méthode d'authentification utilisateur commune sur toutes les instances de base de données.

Découvrez comment et quand partitionner les données.

Créer des structures de données efficaces

Étant donné que Realtime Database récupère les données des nœuds enfants d'un chemin d'accès ainsi que du chemin d'accès lui-même, il est judicieux de conserver une structure de données aussi plate que possible. De cette façon, vous pouvez récupérer de manière sélective les données dont vous avez besoin, sans télécharger de données inutiles sur les clients.

En particulier, tenez compte des écritures et des suppressions lorsque vous structurez vos données. Par exemple, les chemins d'accès comportant des milliers de feuilles peuvent être coûteux à supprimer. Les diviser en chemins d'accès comportant plusieurs sous-arborescences et moins de feuilles par nœud peut accélérer les suppressions.

De plus, chaque écriture peut occuper 0,1 % de l'utilisation totale de votre base de données. Structurez vos données de manière à pouvoir regrouper les écritures en une seule opération sous forme de mises à jour multi-chemins via les méthodes update() des SDK ou les requêtes PATCH RESTful.

Pour optimiser la structure de vos données et améliorer les performances, suivez les bonnes pratiques concernant les structures de données.

Empêcher les accès non autorisés

Empêchez les opérations non autorisées sur votre base de données avec Realtime Database Security Rules. Par exemple, l'utilisation de règles peut éviter un scénario dans lequel un utilisateur malveillant télécharge votre base de données entière à plusieurs reprises.

Découvrez comment utiliser les règles Firebase Realtime Database.

Utiliser des règles basées sur des requêtes pour limiter les téléchargements

Realtime Database Security Rules limitent l'accès aux données de votre base de données, mais elles peuvent également servir de limites aux données renvoyées par les opérations de lecture. Lorsque vous utilisez des règles basées sur des requêtes, telles que définies par des expressions query. comme query.limitToFirst, les requêtes ne récupèrent que les données limitées par la règle.

Par exemple, la règle suivante limite l'accès en lecture aux 1 000 premiers résultats d'une requête, classés par priorité :

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

En savoir plus sur Realtime Database Security Rules.

Index des requêtes

L'indexation de vos données réduit la bande passante totale que vous utilisez pour chaque requête exécutée par votre application.

Réutiliser les sessions SSL

Réduisez les coûts de surcharge de chiffrement SSL sur les connexions reprises en émettant des tickets de session TLS. Cela est particulièrement utile si vous avez besoin de connexions fréquentes et sécurisées à la base de données.

Améliorer l'efficacité des écouteurs

Placez vos écouteurs aussi loin que possible dans le chemin d'accès pour limiter la quantité de données qu'ils synchronisent. Vos écouteurs doivent être proches des données que vous souhaitez qu'ils obtiennent. N'écoutez pas à la racine de la base de données, car cela entraîne le téléchargement de l'intégralité de votre base de données.

Ajoutez des requêtes pour limiter les données renvoyées par vos opérations d'écoute et utilisez des écouteurs qui ne téléchargent que les mises à jour des données (par exemple, on() au lieu de once()). Réservez .once() pour les actions qui ne nécessitent pas de mises à jour des données. De plus, triez vos requêtes à l'aide de orderByKey() dans la mesure du possible pour obtenir les meilleures performances. Le tri avec orderByChild() peut être 6 à 8 fois plus lent, et le tri avec orderByValue() peut être très lent pour les grands ensembles de données, car il nécessite une lecture de l'intégralité de l'emplacement à partir de la couche de persistance.

Veillez également à ajouter des écouteurs de manière dynamique et à les supprimer lorsqu'ils ne sont plus nécessaires.

Nettoyer les données inutilisées

Supprimez régulièrement les données inutilisées ou en double de votre base de données. Vous pouvez exécuter des sauvegardes pour inspecter manuellement vos données ou les sauvegarder régulièrement dans un bucket Google Cloud Storage. Envisagez également d'héberger les données stockées via Cloud Storage for Firebase.

Fournir du code évolutif que vous pouvez mettre à jour

Les applications intégrées aux appareils IoT doivent inclure du code évolutif que vous pouvez mettre à jour facilement. Veillez à tester minutieusement les cas d'utilisation, à tenir compte des scénarios dans lesquels votre base d'utilisateurs pourrait croître de manière exponentielle et à intégrer la possibilité de déployer des mises à jour dans votre code. Réfléchissez attentivement aux modifications majeures que vous devrez peut-être apporter ultérieurement, par exemple si vous décidez de partitionner vos données.