[MySQL] Skalowalność bazy danych

0

Cześć,
jeśli posiadam bazę danych zawierającą sporą ilość tabel i baza stale rośnie (duża ilość rekordów w tabelach) to w jaki sposób powinienem zadbać o jej skalowalność? Pomijając oczywiście kwestie sprzętowe takie jak np. dodanie ramu etc.
Na co zwrócić uwagę przy projektowaniu bazy danych, aby w przyszłości była skalowalna?
Do tej pory wartości dla pól takich jak płeć przechowywałem w oddzielnych tabelach i tworzyłem relację, czy taki zabieg jest ok? Może da się to zrobić lepiej?

Pytam ponieważ jestem świadom, że prędzej czy później moja aplikacja korzystająca z bazy danych zacznie zwalniać, ze względu na długi czas wykonywania poleceń SQL (bardziej skomplikowane SELECTy).

2

Może mnie nie spałują /polakierują w tęczę, ale ile masz tych płci?
'M' 'K' w tabeli głównej nie wystarczy?

teraz pytania:

  • co to znaczy dużo?
  • skalowalność (dziś powszechnie) się rozumie jako zysk wydajnościowo ze względu na rozproszenie na różne maszyny. Dla baz SQL to się (za bardzo) nie udaje, ale jeśli się rozprasza, to tez z innych powodów. Poczytaj słówka partitioning i sharding
    EDIT2: ciekaw jestem, czy się aktywują zwolennicy Postgressa, jako mającego podobno lepsze te koncepcje.
  • może zmienię słowo na "wydajność" - ale to już przeszliśmy nie na "skalowalność" a na rzetelną developerkę bazodanową
    • indeksy
    • pomiar i tuning "bardziej skomplikowanych poleceń". Głownie komenda EXPLAIN

EDIT. .... tak czytam co napisałem, i chciałbym Cię zostawić z rozróżnieniem słów "skalowalność" i "porządny projekt bazy". One gdzieś tam się przenikają, ale są czym innym.

2

generalnie sama ilość danych nie wpływa na wydajność o ile system nie korzysta ze wszystkich danych (np. systemy sprzedażowe, magazynowe, itp. mają ogromny narzut danych archiwalnych, które "przydają się" w większości przypadków jedynie do raportów). Najważniejsze są dwie rzeczy - indeksy i jakość zapytań. O indeksy musisz zadbać sam, mając na uwadze fakt, że wraz ze wzrostem ilości danych indeks, który jeszcze 1M rekordów temu działał dobrze, teraz może nie wystarczać. Co do drugiego to jeśli używasz jakiegoś ORMa to warto się przyjrzeć generowanym zapytaniom, które są bardziej skomplikowane niż select id, imie, nazwisko from uzytkownicy bo może się okazać, że ORM wyprodukował takiego potworka, który po prostu nie ma prawa być szybki. Do tego dochodzą takie mechanizmy jak partycjonowanie danych, widoki zmaterializowane, denormalizacja bazy. Jeśli baza jest naprawdę duża to można się pokusić o rozbicie jej na dwie - jedna zawierająca aktualne dane + dane z np. ostatnich 6 miesięcy oraz druga, która będzie zawierała wszystkie dane (sam proces synchronizacji/czyszczenia można zrealizować na wiele sposobów). Można też zamiast drugiej bazy postawić pseudo hurtownię danych (dane historyczne wymagane przez prawo (np. do wydruku faktur sprzed 5 lat) + dane analityczne.
Temat jest dość szeroki i bez jakichś konkretów ciężko coś powiedzieć.
BTW znam system (ERP dla małych/średnich firm), który działa po 15-20 lat i ma bazy (Oracle) po kilkadziesiąt/kilkaset GB (w zależności od klienta), nigdy nie były jakoś specjalnie optymalizowane (jedynie pojedyncze zapytania, które działały naprawdę wolno), korzysta z tego i po 100-150 stanowisk jednocześnie i daje radę. Serwery są średnio wymieniane co 4-5 lat i aktualnie najczęściej są to jakieś 2 procesorowe maszyny z 32-64 GB RAM i dyskami talerzowymi w RAIDzie (jeden klient ma SSD). Więc jeśli nie przewidujesz przyrostu danych na poziomie 1TB na rok i ruchu na poziomie 1000 jednocześnie pracujących stanowisk to nie masz się co przejmować na zapas. Oczywiście nie oznacza to, że można wszystko upchnąć do jednej tabeli bez indeksów :).
Jeśli ktoś miał do czynienia z jakimś starszym systemem, gdzie pierwsze wersje były jeszcze w Clipperze potem Harborze, Delphi, C# a gdzie dodatkowo przewija się PHP oraz każda nowa funkcjonalność coś zmieniała w bazie to wie jak takie coś potrafi wyglądać.

1

Temat bardzo szeroki, bo jest wiele aspektów które trzeba uwzględnić. Przede wszystkim co uważasz za dużą bazę bo wg mnie baza 100GB-999GB to jest baza średniej wielkości, a duża baza zaczyna się od 1TB. Oprócz tego ważna jest liczba użytkowników równocześnie korzystających z bazy bo 1 użytkownik na dużej bazie może sprawiać mniej problemu niż 1000 użytkowników na mniejszej bazie. Sam projekt bazy też nie zawsze da się w pełni zoptymalizować pod kątem wydajności bo często są aspekty biznesowe, które wymagają pewnej nadmiarowości np. jeżeli w bazie miałbyś tylko obywateli polskich to masz pewny klucz jako numer PESEL, ale jak dojdą obcokrajowcy to okazuje się, że musi być użyte jakieś inne pole np. nr paszportu. Do tego dochodzi aspekt sprzętowy i oczywiście budżet jakim dysponujesz na zakup sprzętu. Przy bazach danych jeżeli chodzi o pamięć operacyjną to górną granicą jest "sky is the limit ", do tego dochodzi wydajność dysków i możliwość "rozłożenia" plików bazy na różnych zasobach dyskowych.Moim zdaniem z punktu widzenia osoby odbierającej kilka razy duże systemy bazodanowe największym problemem są słabe testy wydajnościowe prowadzone przez wykonawców

1 użytkowników online, w tym zalogowanych: 0, gości: 1