Optymalizuj wydajność bazy danych

Jest kilka sposobów na poprawę wydajności Firebase Realtime Database w aplikacji. Aby dowiedzieć się, co możesz zrobić, żeby zoptymalizować wydajność Realtime Database, zbierz dane za pomocą różnych narzędzi do monitorowania Realtime Database, a następnie wprowadź odpowiednie zmiany w aplikacji lub Realtime Database.

Monitorowanie 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 wymaganego poziomu szczegółowości:

  • Ogólne omówienie: użyj narzędzia do profilowania, aby uzyskać listę niezindeksowanych zapytań i ogólne omówienie operacji odczytu i zapisu w czasie rzeczywistym.
  • Szacunkowe wykorzystanie podlegające opłacie: użyj wskaźników wykorzystania dostępnych w konsoli Firebase, aby wyświetlić wykorzystanie podlegające opłacie i ogólne wskaźniki skuteczności.
  • Szczegółowe informacje: 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.

Strategie poprawy skuteczności w skrócie
Wskaźnik Opis Sprawdzone metody
Obciążenie/wykorzystanie Zoptymalizuj wykorzystanie pojemności bazy danych do przetwarzania żądań w danym momencie (odzwierciedlone we wskaźnikach **Obciążenie** lub **io/database_load**). Optymalizacja struktury danych
Fragmentowanie danych w bazach danych
Zwiększanie wydajności detektorów
Ograniczanie pobierania za pomocą reguł opartych na zapytaniach
Optymalizacja połączeń
Aktywne połączenia Zrównoważ liczbę jednoczesnych aktywnych połączeń z bazą danych, aby nie przekroczyć limitu 200 000 połączeń. Podziel dane na fragmenty między bazami danych
Zmniejsz liczbę nowych połączeń
przepustowość dla ruchu wychodzącego, Jeśli pobieranie z bazy danych wydaje się większe, niż chcesz, możesz zwiększyć wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. Optymalizacja połączeń
Optymalizacja struktury danych
Ograniczanie pobierania za pomocą reguł opartych na zapytaniach
Ponowne używanie sesji SSL
Zwiększanie wydajności detektorów
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. Czyszczenie nieużywanych danych
Optymalizacja struktury danych
Fragmentowanie danych w bazach danych
Korzystanie z Cloud Storage for Firebase

Optymalizacja połączeń

Żą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 generować znacznie większe koszty połączeń, obciążenie bazy danych i przepustowość dla ruchu wychodzącego niż aktywne połączenia z bazą danych w czasie rzeczywistym.

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

Jeśli używasz interfejsu REST API, rozważ użycie protokołu HTTP keep-alive, aby utrzymać otwarte połączenie, lub zdarzeń wysyłanych przez serwer, co może obniżyć koszty związane z uzgadnianiem SSL.

Fragmentowanie danych w wielu bazach danych

Podział danych między wiele instancji Realtime Database, czyli fragmentowanie bazy danych, zapewnia 3 korzyści:

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

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

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

Tworzenie wydajnych struktur danych

Ponieważ Realtime Database pobiera dane z węzłów podrzędnych ścieżki, a także ze ścieżki, warto zachować jak najbardziej płaską strukturę danych. Dzięki temu możesz selektywnie pobierać potrzebne dane bez pobierania niepotrzebnych danych do klientów.

Podczas tworzenia struktury danych weź pod uwagę zwłaszcza operacje zapisu i usuwania. Na przykład usunięcie ś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.

Dodatkowo każdy zapis może zająć 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ń RESTful PATCH.

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

Ochrona przed nieuprawnionym dostępem

Zapobiegaj nieautoryzowanym operacjom na 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 używaniu reguł Bazy danych czasu rzeczywistego Firebase.

Używanie reguł opartych na zapytaniach do ograniczania pobierania

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, które są zdefiniowane przez wyrażenia query., takie jak 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 dotyczące indeksu

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

Ponowne używanie sesji SSL

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

Zwiększanie wydajności detektora

Umieść detektory jak najdalej na ścieżce, aby ograniczyć ilość synchronizowanych danych. Odbiorcy powinni znajdować się blisko danych, które mają otrzymać. 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 detektoró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(), gdy tylko jest to możliwe. 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ć detektory dynamicznie i usuwać je, gdy nie są już potrzebne.

Czyszczenie 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 zasobniku Google Cloud Storage. Możesz też rozważyć przechowywanie danych w Cloud Storage for Firebase.

Wdraż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 liczba użytkowników może gwałtownie wzrosnąć, i zapewnić możliwość wdrażania aktualizacji kodu. Dokładnie przemyśl poważne zmiany, które mogą być konieczne w przyszłości, np. jeśli zdecydujesz się na fragmentację danych.