Optymalizuj wydajność bazy danych

Istnieje kilka sposobów na poprawę Firebase Realtime Databaseskuteczności aplikacji. Aby dowiedzieć się, co możesz zrobić, aby zoptymalizować Realtime Databaseskuteczność, zbieraj dane za pomocą różnych Realtime Databasenarzędzi do monitorowania, a następnie wprowadzaj zmiany w aplikacji lub Realtime Databaseodpowiednio z niej korzystaj.

Sprawdzanie skuteczności Realtime Database

Dane o skuteczności Realtime Database 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 profilera, aby uzyskać listę niezindeksowanych zapytań i przegląd operacji odczytu/zapisu w czasie rzeczywistym.
  • Szacunkowe wykorzystanie podlegające rozliczeniu: użyj danych o wykorzystaniu dostępnych w Firebase konsoli, aby sprawdzić wykorzystanie podlegające rozliczeniu i ogólne dane o skuteczności.
  • Szczegółowe dane: użyj Cloud Monitoring, aby uzyskać bardziej szczegółowe informacje o wydajności bazy danych w czasie.

Zwiększanie skuteczności według danych

Po zebraniu danych zapoznaj się z tymi sprawdzonymi metodami i strategiami, które pomogą Ci poprawić skuteczność w wybranym obszarze.

Szybki przegląd strategii poprawy skuteczności
Dane Opis Sprawdzone metody
Obciążenie/wykorzystanie Zoptymalizuj wykorzystanie pojemności bazy danych podczas przetwarzania żądań w danym momencie (odzwierciedlone w metrykach **Obciążenie** lub **io/database_load**). Zoptymalizuj strukturę danych
Dziel dane między bazami danych
Zwiększ wydajność odbiorników
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 000 połączeń. Dzielenie danych na bazy danych
Ograniczanie liczby nowych połączeń
Przepustowość dla ruchu wychodzącego Jeśli liczba pobrań z bazy danych wydaje się wyższa niż oczekiwana, możesz zwiększyć wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. Optymalizowanie połączeń
Optymalizowanie struktury danych
Ograniczanie pobierania za pomocą reguł opartych na zapytaniach
Ponowne wykorzystywanie sesji SSL
Zwiększanie wydajności odbiornika
Ograniczanie dostępu do danych
Miejsce na dane Upewnij się, że nie przechowujesz nieużywanych danych, lub rozłóż przechowywane dane na inne bazy danych lub usługi Firebase, aby nie przekroczyć limitu. Usuwanie nieużywanych danych
Optymalizacja struktury danych
Dzielenie danych na bazy danych
Używanie Cloud Storage for Firebase

Połączenia z Optimize

Żądania RESTful, takie jak GETPUT, nadal wymagają połączenia, nawet jeśli jest ono krótkotrwałe. Te częste, krótkotrwałe połączenia mogą w rzeczywistości generować znacznie wyższe koszty połączeń, obciążenie bazy danych i wychodzącą przepustowość niż aktywne połączenia z bazą danych w czasie rzeczywistym.

W miarę możliwości używaj natywnych pakietów SDK dla platformy aplikacji zamiast interfejsu REST API. Zestawy 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 korzystasz z interfejsu API REST, rozważ użycie funkcji HTTP keep-alive, aby utrzymać otwarte połączenie, lub użyj zdarzeń wysyłanych przez serwer, co może zmniejszyć koszty związane z uzgadnianiem połączenia SSL.

Dzielenie danych na fragmenty w wielu bazach danych

Podział danych na kilka instancji Realtime Database, czyli tzw. fragmentowanie bazy danych, ma 3 zalety:

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

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

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

Tworzenie wydajnych struktur danych

Funkcja Realtime Database pobiera dane z węzłów podrzędnych ścieżki, a także z samej ścieżki, dlatego 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 urządzenia klienckie.

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

Dodatkowo każdy zapis może wykorzystywać 0, 1% całego wykorzystania bazy danych. Uporządkuj dane w taki sposób, aby umożliwić wykonywanie operacji zapisu w pakietach w ramach jednej operacji jako aktualizacji wielościeżkowych za pomocą metod update() w pakietach SDK lub żądań RESTful PATCH.

Aby zoptymalizować strukturę danych i zwiększyć wydajność, postępuj zgodnie ze sprawdzonymi metodami dotyczącymi struktur danych.

Zapobieganie nieautoryzowanemu dostępowi

Zapobiegaj nieautoryzowanym operacjom w bazie danych za pomocą funkcji Realtime Database Security Rules. Na przykład używanie 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 ograniczać dostęp do danych w bazie danych, ale mogą też służyć jako ograniczenia danych zwracanych w ramach operacji odczytu. Jeśli używasz reguł opartych na zapytaniach, zdefiniowanych przez wyrażenia query., np. query.limitToFirst, zapytania pobierają tylko dane ograniczone przez 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.

Zapytania do indeksu

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

Ponowne wykorzystywanie 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 skuteczności słuchaczy

Umieść słuchaczy jak najdalej na ścieżce, aby ograniczyć ilość synchronizowanych przez nich danych. Odbiorcy powinni znajdować się blisko danych, które mają otrzymywać. Nie nasłuchuj 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 nasłuchiwaczy, które pobierają tylko aktualizacje danych, np. on() zamiast once(). Zarezerwuj .once() dla działań, które naprawdę nie wymagają aktualizacji danych. Dodatkowo, aby uzyskać najlepsze wyniki, w miarę możliwości sortuj zapytania za pomocą funkcji orderByKey(). Sortowanie za pomocą funkcji orderByChild() może być 6–8 razy wolniejsze, a sortowanie za pomocą funkcji orderByValue() może być bardzo wolne w przypadku dużych zbiorów danych, ponieważ wymaga odczytania całej lokalizacji z warstwy trwałości.

Pamiętaj też, aby dynamicznie dodawać odbiorców i usuwać ich, gdy nie są już potrzebni.

Usuwanie nieużywanych danych

Okresowo usuwaj z bazy danych nieużywane lub zduplikowane dane. Możesz uruchamiać kopie zapasowe, aby ręcznie sprawdzać dane lub okresowo tworzyć ich kopie zapasowe w Google Cloud Storage zasobniku. Możesz też rozważyć hostowanie przechowywanych danych za pomocą Cloud Storage for Firebase.

Wysyłaj skalowalny kod, który możesz aktualizować

Aplikacje wbudowane w urządzenia IoT powinny zawierać skalowalny kod, który można łatwo aktualizować. Dokładnie przetestuj przypadki użycia, uwzględnij scenariusze, w których baza użytkowników może się gwałtownie powiększyć, i zadbaj o możliwość wdrażania aktualizacji kodu. Dokładnie rozważ główne zmiany, które mogą być konieczne w przyszłości, np. jeśli zdecydujesz się podzielić dane na fragmenty.