Optymalizacja wydajności bazy danych

Istnieje kilka różnych sposobów poprawy wydajności bazy danych Firebase Realtime Database w aplikacji. Aby dowiedzieć się, co możesz zrobić, aby zoptymalizować wydajność Bazy danych czasu rzeczywistego, zbierz dane za pomocą różnych narzędzi do monitorowania bazy danych czasu rzeczywistego, a następnie wprowadź odpowiednie zmiany w aplikacji lub korzystaniu z bazy danych czasu rzeczywistego.

Monitoruj wydajność bazy danych w czasie rzeczywistym

Możesz zbierać dane o wydajności bazy danych czasu rzeczywistego za pomocą kilku różnych narzędzi, w zależności od wymaganego poziomu szczegółowości:

  • Przegląd wysokiego poziomu: Użyj narzędzia profilera, aby uzyskać listę niezindeksowanych zapytań i przegląd operacji odczytu/zapisu w czasie rzeczywistym.
  • Szacunkowe rozliczenie użycia: użyj wskaźników użytkowania dostępnych w konsoli Firebase , aby zobaczyć rozliczone dane dotyczące wykorzystania i ogólne wskaźniki wydajności.
  • Szczegółowa analiza: użyj Cloud Monitoring, aby uzyskać bardziej szczegółowy wgląd w działanie bazy danych na przestrzeni czasu.

Popraw wydajność według wskaźników

Po zebraniu danych zapoznaj się z poniższymi najlepszymi praktykami i strategiami w oparciu o obszar wydajności, który chcesz poprawić.

Strategie poprawy wydajności w skrócie
Metryczny Opis Najlepsze praktyki
Obciążenie/wykorzystanie Zoptymalizuj, jaka część bazy danych jest wykorzystywana do przetwarzania żądań w danym momencie (odzwierciedlona w metrykach **Load** lub **io/database_load**). Zoptymalizuj strukturę danych
Dane fragmentów w bazach danych
Popraw wydajność słuchacza
Ogranicz pobieranie za pomocą reguł opartych na zapytaniach
Optymalizuj połączenia
Aktywne połączenia Zrównoważ liczbę jednoczesnych, aktywnych połączeń z bazą danych, aby nie przekroczyć limitu 200 000 połączeń. Dane fragmentów w bazach danych
Ogranicz liczbę nowych połączeń
Pasmo wychodzące Jeśli liczba pobrań z Twojej bazy danych wydaje się większa niż chcesz, możesz poprawić wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. Optymalizuj połączenia
Zoptymalizuj strukturę danych
Ogranicz pobieranie za pomocą reguł opartych na zapytaniach
Wykorzystuj ponownie sesje SSL
Popraw wydajność słuchacza
Ogranicz dostęp do danych
Składowanie Upewnij się, że nie przechowujesz nieużywanych danych, lub zrównoważ przechowywane dane w innych bazach danych i/lub produktach Firebase, aby nie przekroczyć limitu. Wyczyść nieużywane dane
Zoptymalizuj strukturę danych
Dane fragmentów w bazach danych
Użyj Cloud Storage dla Firebase

Optymalizuj połączenia

Żądania RESTful, takie jak GET i PUT , nadal wymagają połączenia, nawet jeśli to połączenie jest krótkotrwałe. Te częste, krótkotrwałe połączenia mogą w rzeczywistości skutkować znacznie większymi kosztami połączeń, obciążeniem bazy danych i przepustowością wychodzącą niż aktywne połączenia z bazą danych w czasie rzeczywistym.

Jeśli to możliwe, używaj natywnych zestawów SDK dla platformy swojej aplikacji zamiast interfejsu API REST. Zestawy SDK utrzymują otwarte połączenia, redukując koszty szyfrowania SSL i obciążenie bazy danych, które może wystąpić w przypadku interfejsu API REST.

Jeśli korzystasz z interfejsu API REST, rozważ użycie funkcji utrzymywania aktywności HTTP w celu utrzymania otwartego połączenia lub użyj zdarzeń wysyłanych przez serwer , co może zmniejszyć koszty związane z uzgadnianiem SSL.

Dane fragmentów w wielu bazach danych

Dzielenie danych na wiele instancji bazy danych czasu rzeczywistego, zwane także fragmentowaniem bazy danych, oferuje trzy korzyści:

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

Jeśli korzystasz z planu cenowego Blaze , możesz utworzyć wiele instancji bazy danych w ramach tego samego projektu Firebase, wykorzystując wspólną metodę uwierzytelniania użytkowników w instancjach baz danych.

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

Buduj wydajne struktury danych

Ponieważ baza danych czasu rzeczywistego pobiera dane z węzłów podrzędnych ścieżki oraz ze ścieżki, rozsądne jest utrzymywanie możliwie płaskiej struktury danych. W ten sposób możesz selektywnie pobierać potrzebne dane, bez konieczności pobierania niepotrzebnych danych klientom.

W szczególności rozważ zapisy i usunięcia podczas strukturyzacji danych. Na przykład ścieżki z tysiącami liści są potencjalnie kosztowne w usuwaniu. Podział ich na ścieżki z wieloma poddrzewami i mniejszą liczbą liści na węzeł może przyspieszyć usuwanie.

Ponadto każdy zapis może zająć 0,1% całkowitego wykorzystania bazy danych. Ustrukturyzuj dane w sposób umożliwiający grupowanie zapisów w jedną operację w postaci aktualizacji wielościeżkowych za pomocą metod update() w zestawach SDK lub żądań RESTful PATCH .

Aby zoptymalizować strukturę danych i poprawić wydajność, postępuj zgodnie z najlepszymi praktykami dotyczącymi struktur danych .

Zapobiegaj nieautoryzowanemu dostępowi

Zapobiegaj nieautoryzowanym operacjom na bazie danych dzięki regułom bezpieczeństwa bazy danych Realtime. Na przykład użycie reguł pozwala uniknąć scenariusza, w którym złośliwy użytkownik wielokrotnie pobiera całą bazę danych.

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

Użyj reguł opartych na zapytaniach, aby ograniczyć pobieranie

Reguły bezpieczeństwa bazy danych w czasie rzeczywistym ograniczają dostęp do danych w bazie danych, ale mogą również służyć jako ograniczenia danych zwracanych w wyniku operacji odczytu. Kiedy używasz reguł opartych na zapytaniach, zdefiniowanych przez query. wyrażenia takie jak query.limitToFirst , zapytania pobierają tylko dane ograniczone regułą.

Na przykład poniższa 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 regułach bezpieczeństwa baz danych w czasie rzeczywistym .

Zapytania indeksowe

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

Wykorzystuj ponownie sesje SSL

Zmniejsz koszty ogólne szyfrowania SSL w przypadku wznowionych połączeń, wystawiając bilety sesji TLS . Jest to szczególnie przydatne, jeśli wymagane są częste i bezpieczne połączenia z bazą danych.

Popraw wydajność słuchacza

Umieść słuchaczy jak najdalej od ścieżki, aby ograniczyć ilość synchronizowanych danych. Twoi słuchacze powinni znajdować się blisko danych, które chcesz im uzyskać. 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 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, jeśli to możliwe, sortuj zapytania za pomocą orderByKey() , aby uzyskać najlepszą wydajność. Sortowanie za pomocą orderByChild() może być 6–8 razy wolniejsze, a sortowanie za pomocą orderByValue() może być bardzo powolne w przypadku dużych zbiorów danych, ponieważ wymaga odczytu całej lokalizacji z warstwy trwałości.

Pamiętaj także o dynamicznym dodawaniu słuchaczy i usuwaniu ich, gdy nie są już potrzebni.

Wyczyść nieużywane dane

Okresowo usuwaj wszelkie nieużywane lub zduplikowane dane z bazy danych. Możesz uruchamiać kopie zapasowe , aby ręcznie sprawdzać swoje dane lub okresowo tworzyć ich kopie zapasowe w zasobniku Google Cloud Storage. Rozważ także hosting przechowywanych danych za pośrednictwem Cloud Storage dla Firebase .

Dostarczaj skalowalny kod, który możesz aktualizować

Aplikacje wbudowane w urządzenia IoT powinny zawierać skalowalny kod, który można łatwo aktualizować. Pamiętaj o dokładnym przetestowaniu przypadków użycia, uwzględnieniu scenariuszy, w których możesz wykładniczo powiększyć bazę użytkowników, i wbudowaniu możliwości wdrażania aktualizacji kodu. Dokładnie rozważ główne zmiany, które mogą być konieczne, jeśli na przykład zdecydujesz się na fragmentację danych.