Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rozwiązanie dla dużego zbioru danych statystycznych, Wybór bazy i struktury, rozważania o algorytmach i strukturach
mathijas
post 19.03.2015, 09:39:51
Post #1





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 9.10.2008

Ostrzeżenie: (0%)
-----


Witam,

Czy ktoś może ma doświadczenie i chciałby się podzielić w takiej sytuacji jak przedstawiam poniżej?

Mam (ciągle rosnącą) bazę danych pochodzących z kilkunastu różnych źródeł. Dane te z każdego źródła standaryzuję i upycham do jednej tabeli celem dalszej obróbki i przygotowania danych pod wykresy. Dane te rozróżnialne są przez pięć kolumn charakterystycznych: id źródła, data wpisu, id elementu którego dane dotyczą, typ i kraj, nazwijmy je col1..col5. Czyli tabelka wygląda tak:
id,col1,col2,col3,col4,col5,further_columns_with_data_to_show

Tyle backendu.

Od strony użytkownika to wygląda tak, że może wybrać zakres dat, jeden/kilka/wszystkie elementy, jeden/kilka/wszystkie kraje, jeden/kilka/wszystkie źródła i ewentualnie rozróżnić je po typach, klika "go!" i dostaje wykres iluś serii. Dodatkowo, może zechcieć zsumować dane po którejś kolumnie, na przykład chce mieć wykres z jedną serią dla każdego elementu (skumulowane kraje i źródła). Jedyne czego się nie da zsumować to daty - wykres zawsze jest dzień po dniu.

Tyle frontendu.

Wracając do bazy danych. Przygotowałem indeksy na tej tabeli pozwalające na wyświetlenie danych w "wybieraczkach" oraz jeden indeks do wyciągania danych, zawierajacy dane do wyświetlenia (celem przyspieszenia obliczeń). Wszystko działa w miarę sprawnie, to znaczy czas wykonania zapytania waha się, w zalezności od wybranych danych 0.1s-3s. Wierszy obecnie jest ponad 20mln. Wszystkie zapytania wykorzystują indeks, widać jego pracę itd.

Pytanie teoretyczne brzmi: jak to można przyspieszyć? Jaką użyć bazę, jak ułożyć struktury? Pomysły? Może przenieść to do plików i grep|awk? Albo Mongo? Pre-liczenie danych do wyświetlenia i redundancja?
Go to the top of the page
+Quote Post
Pyton_000
post 19.03.2015, 10:58:50
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


czy jest jakieś pole w tej tabeli które może posłużyć za podziałkę danych i czy w ramach różnych podziałek łącznie może nastąpić wyszukiwanie?

Bo jeżeli możesz logicznie podzielić dane na jakiś typ (cokolwiek) a potem wyszukiwanie odbywa się tylko w ramach tego typu to możesz spokojnie zastosować partycjonowanie.
Da to kopa. Bo jeśli "typ" nie jest taką granicą to raczej coś NonSQL typu Mongo

Go to the top of the page
+Quote Post
mathijas
post 19.03.2015, 11:21:55
Post #3





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 9.10.2008

Ostrzeżenie: (0%)
-----


Nie wiem czy Cię dobrze zrozumiałem. Dane na pewno są dzielone względem dni, nie robię sum z zakresu, tylko dzień po dniu. Poza tym jest to macierz 4x4 i może być tam dosłownie wszystko. Raz ktoś zapyta o sumę dla wszystkich elementów które wykazuje dane źródło, raz ktoś zechce porównać jak poszczególne elementy są raportowane przez różne źródła (i oleje kraje), a raz postanowi prześledzić historię konkretnego elementu w danym kraju według raportów z danego źródła i wybierze konkretnie jedną serię. Ciężki przypadek. "Elementy" są globalne i pojawiają się we wszystkich krajach, u wszystkich źródeł i dane dla nich mogą mieć wszystkie dostępne typy. Ale nie muszą. Streściłbym to: kolekcja (po datach) macierzy 4x4 (+dane).

Zastanawiałem się nad mongo, ale to jest raczej baza na dokumenty, hierarchiczna, i nie wiem czy przeszukiwanie iluś obiektów w celu policzenia średniej z jakiejś wartości to dobre zastosowanie dla niej... Są tam jakieś kolekcje danych na których można wykonywać agregacje?

Ten post edytował mathijas 19.03.2015, 11:22:51
Go to the top of the page
+Quote Post
Pyton_000
post 19.03.2015, 13:47:31
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


A ile jest ~ danych np. w mc/roku?
Go to the top of the page
+Quote Post
Forti
post 19.03.2015, 13:59:41
Post #5





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

Ostrzeżenie: (0%)
-----


ablo nie doczytałem albo nie napisałeś. Masz to w mysql? Jeżeli tak to i tak masz rewelacyjny czas dostępy do 20 mln rekordów. Możesz spróbować przejść na postgres, interface PDO / ORM nie zmieni się praktycznie a powinieneś troche zyskać na tym.


--------------------
Overwatch24 - najbardziej zaawansowany Polski portal Overwatch od fanów dla fanów.

Fachowo.co

Behance.net/fachowo
Go to the top of the page
+Quote Post
mathijas
post 20.03.2015, 11:35:14
Post #6





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 9.10.2008

Ostrzeżenie: (0%)
-----


Dzięki za podpowiedzi. Tak, mysql. Mam inną część serwisu do przepisania, poeksperymentuję co można wyciągnąć z mongo. Może jakieś zbiory indeksów walnę w redisie a z mysql'a będę wyciągał dane rangem, chociaż nie wiem jeszcze co by to miało przyspieszyć :). Nie wiem ile czasu i pieniędzy da mi na to szef inwestor ;). W każdym bądź razie, jak uda mi się zrobić z tego demona prędkości, to podzielę się uwagami w tym wątku.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 09:38