Optymalizuj wydajność bazy danych

Istnieje kilka sposobów na zwiększenie Firebase Realtime Database wydajności w aplikacji. Aby dowiedzieć się, co możesz zrobić, aby zoptymalizować Realtime Database wydajność, zbieraj dane za pomocą różnych Realtime Database narzędzi do monitorowania, a następnie wprowadź odpowiednie zmiany w aplikacji lub sposobie korzystania z Realtime Database.

Sprawdzanie wydajności Realtime Database

Dane o wydajności Realtime Database's możesz zbierać za pomocą kilku różnych narzędzi, w zależności od potrzebnego poziomu szczegółowości:

  • Ogólny przegląd: użyj programu profilującego aby wyświetlić listę niezindeksowanych zapytań i przegląd operacji odczytu/zapisu w czasie rzeczywistym.
  • Szacowanie płatnego wykorzystania: użyj danych o wykorzystaniu dostępnych w konsoli Firebase , aby sprawdzić płatne wykorzystanie i ogólne dane o skuteczności.
  • Szczegółowe informacje: Użyj Cloud Monitoring , aby uzyskać bardziej szczegółowe informacje o tym, jak baza danych działa w czasie.

Zwiększanie wydajności według danych

Po zebraniu danych zapoznaj się z tymi sprawdzonymi metodami i strategiami, które są oparte na obszarze wydajności, który chcesz poprawić.

Strategie zwiększania wydajności w skrócie
Dane Opis Sprawdzone metody
Obciążenie/wykorzystanie Zoptymalizuj wykorzystanie pojemności bazy danych do przetwarzania żądań w danym momencie (odzwierciedlone w danych **Obciążenie** lub **io/database_load**). Zoptymalizuj strukturę danych
Podziel dane na bazy danych
Zwiększ wydajność odbiornika
Ogranicz pobieranie za pomocą reguł opartych na zapytaniach
Zoptymalizuj połączenia
Aktywne połączenia Zrównoważ liczbę jednoczesnych aktywnych połączeń z bazą danych, aby nie przekroczyć limitu 200 tys. połączeń. Podziel dane na bazy danych
Zmniejsz liczbę nowych połączeń
Przepustowość dla ruchu wychodzącego Jeśli pobieranie z bazy danych jest większe niż oczekiwane, możesz zwiększyć wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. Zoptymalizuj połączenia
Zoptymalizuj strukturę danych
Ogranicz pobieranie za pomocą reguł opartych na zapytaniach
Ponownie używaj sesji SSL
Zwiększ wydajność odbiornika
Ogranicz dostęp do danych
Miejsce na dane Sprawdź, czy nie przechowujesz nieużywanych danych, lub zrównoważ przechowywane dane w innych bazach danych lub usługach Firebase, aby nie przekroczyć limitu. Zwolnij miejsce, usuwając nieużywane dane
Zoptymalizuj strukturę danych
Podziel dane na fragmenty w bazach danych
Używaj Cloud Storage for Firebase

Zoptymalizuj połączenia

Żądania RESTful, takie jak GET i PUT, nadal wymagają połączenia, nawet jeśli jest ono krótkotrwałe. Te częste, krótkotrwałe połączenia mogą w rzeczywistości zwiększyć koszty połączeń, obciążenie bazy danych i przepustowość dla ruchu wychodzącego w znacznie większym stopniu niż aktywne połączenia z bazą danych w czasie rzeczywistym.

Jeśli to możliwe, używaj natywnych pakietów SDK dla platformy aplikacji zamiast interfejsu API REST. Pakiety SDK utrzymują otwarte połączenia, co zmniejsza koszty szyfrowania SSL i obciążenie bazy danych, które mogą się zwiększać w przypadku interfejsu API REST.

Jeśli używasz interfejsu API (typu) REST, rozważ użycie funkcji HTTP utrzymywania aktywności, aby utrzymać otwarte połączenie, lub użyj zdarzeń wysyłanych przez serwer, co może zmniejszyć koszty związane z uzgadnianiem połączenia protokołu SSL.

Podziel dane na wiele baz danych

Podzielenie danych na wiele instancji Realtime Database, czyli fragmentacja bazy danych, ma 3 zalety:

  1. Zwiększ łączną liczbę jednoczesnych aktywnych połączeń dozwolonych w aplikacji, dzieląc je na instancje bazy danych.
  2. Zrównoważ obciążenie między instancjami bazy danych.
  3. Jeśli masz niezależne grupy użytkowników, które potrzebują dostępu tylko do dyskretnych zbiorów danych, użyj różnych instancji bazy danych, aby zwiększyć przepustowość i zmniejszyć opóźnienie.

Jeśli korzystasz z abonamentu Blaze, możesz utworzyć wiele instancji bazy danych w tym samym projekcie w Firebase, korzystając z wspólnej metody uwierzytelniania użytkowników w instancjach bazy danych.

Dowiedz się więcej o tym, jak i kiedy dzielić dane.

Tworzenie wydajnych struktur danych

Ponieważ Realtime Database pobiera dane z węzłów podrzędnych ścieżki oraz z samej ścieżki, warto, aby struktura danych była jak najbardziej płaska. Dzięki temu możesz selektywnie pobierać potrzebne dane bez konieczności pobierania niepotrzebnych danych na klientów.

Podczas tworzenia struktury danych zwróć szczególną uwagę na zapisy i usuwanie. Na przykład usuwanie ścieżek z tysiącami liści może być kosztowne. Podzielenie ich na ścieżki z wieloma poddrzewami i mniejszą liczbą liści na węzeł może przyspieszyć usuwanie.

Każdy zapis może też wykorzystać 0, 1% całkowitego wykorzystania bazy danych. Uporządkuj dane w taki sposób, aby można było grupować zapisy w jedną operację jako aktualizacje wielościeżkowe za pomocą metod update() w pakietach SDK lub żądań PATCH RESTful.

Aby zoptymalizować strukturę danych i zwiększyć wydajność, stosuj sprawdzone metody dotyczące struktur danych.

Zapobiegaj nieautoryzowanemu dostępowi

Zapobiegaj nieautoryzowanym operacjom w bazie danych za pomocą Realtime Database Security Rules. Na przykład użycie reguł może zapobiec sytuacji, w której złośliwy użytkownik wielokrotnie pobiera całą bazę danych.

Dowiedz się więcej o korzystaniu z reguł Bazy danych czasu rzeczywistego Firebase.

Ograniczanie pobierania za pomocą reguł opartych na zapytaniach

Realtime Database Security Rules ograniczają dostęp do danych w bazie danych, ale mogą też służyć jako limity danych zwracanych przez operacje odczytu. Gdy używasz reguł opartych na zapytaniach, zdefiniowanych przez wyrażenia query., takie jak query.limitToFirst, zapytania pobierają tylko dane ograniczone regułą.

Na przykład ta reguła ogranicza dostęp do odczytu tylko do pierwszych 1000 wyników zapytania, uporządkowanych według priorytetu:

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

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

Dowiedz się więcej o Realtime Database Security Rules.

Indeksowanie zapytań

Indeksowanie danych zmniejsza całkowitą przepustowość używaną przez każde zapytanie uruchamiane przez aplikację.

Ponowne używanie sesji SSL

Zmniejsz koszty związane z szyfrowaniem SSL w przypadku wznowionych połączeń, wydając bilety sesji TLS. Jest to szczególnie przydatne, jeśli często potrzebujesz bezpiecznych połączeń z bazą danych.

Zwiększanie wydajności odbiornika

Umieść odbiorniki jak najdalej w ścieżce, aby ograniczyć ilość synchronizowanych przez nie danych. Odbiorniki powinny znajdować się blisko danych, które mają pobierać. Nie używaj odbiornika w katalogu głównym bazy danych, ponieważ spowoduje to pobranie całej bazy danych.

Dodaj zapytania, aby ograniczyć dane zwracane przez operacje nasłuchiwania, i używaj odbiorników, które pobierają tylko aktualizacje danych – na przykład on() zamiast once(). Zarezerwuj .once() dla działań, które naprawdę nie wymagają aktualizacji danych. Dodatkowo, aby uzyskać najlepszą wydajność, sortuj zapytania za pomocą orderByKey(). Sortowanie za pomocą orderByChild() może być 6–8 razy wolniejsze, a sortowanie za pomocą orderByValue() może być bardzo wolne w przypadku dużych zbiorów danych, ponieważ wymaga odczytu całej lokalizacji z warstwy trwałości.

Pamiętaj też, aby dodawać odbiorniki dynamicznie i usuwać je, gdy nie są już potrzebne.

Zwalniaj miejsce, usuwając nieużywane dane

Okresowo usuwaj nieużywane lub zduplikowane dane w bazie danych. Możesz tworzyć kopie zapasowe, aby ręcznie sprawdzać dane, lub okresowo tworzyć ich kopie zapasowe w zasobniku Google Cloud Storage. Rozważ też hostowanie przechowywanych danych w Cloud Storage for Firebase.

Wysyłanie skalowalnego kodu, który można aktualizować

Aplikacje wbudowane w urządzenia IoT powinny zawierać skalowalny kod, który można łatwo aktualizować. Pamiętaj, aby dokładnie przetestować przypadki użycia, uwzględnić scenariusze, w których możesz wykładniczo zwiększyć liczbę użytkowników, i wbudować możliwość wdrażania aktualizacji kodu. Dokładnie rozważ główne zmiany, które mogą być potrzebne w przyszłości, np. jeśli zdecydujesz się podzielić dane.