2011-12-20 6 views
6

Jak zbudować odpowiednią strukturę dla usługi analitycznej? Obecnie mam 1 tabelę, która przechowuje dane o każdym użytkowniku, który odwiedza stronę z identyfikatorem mojego klienta, więc później moi klienci będą mogli zobaczyć statystyki dla określonej daty.Jak zbudować odpowiednią bazę danych dla systemu analizy ruchu?

Dzisiaj zastanawiałem się trochę i zastanawiam się: powiedzmy, że mam 1000 użytkowników i każdy ma codziennie około 1000 wyświetleń na swoich stronach, co oznacza, że ​​każdego dnia otrzymuję 1 000 000 (1M) nowych rekordów do jednej tabeli. Jak to będzie działać po około 2 miesiącach (kiedy tabela osiągnie rekord 60 milionów)?

Po prostu myślę, że po pewnym czasie będzie miał tyle rekordów, że zapytania PHP, aby wyciągnąć dane, będą naprawdę ciężkie, powolne i zabierają dużo zasobów, czy to prawda? i jak temu zapobiec?

Mój znajomy pracuje nad czymś podobnym, a dla każdego klienta przygotuje nowy stół, czy to jest właściwy sposób na rozpoczęcie pracy?

Dzięki!

+0

rozważ, jak polecić książkę! – linuxeasy

+1

@linuxeasy który? – k102

Odpowiedz

1

Consider this Link to the Google Analytics Platform Components Overview page i zwrócić szczególną uwagę na sposób zapisywania danych w bazie danych, opierając się wyłącznie na architekturze całego systemu.

Zamiast zapisywać wszystko od razu w bazie danych, można zapisać wszystko do pliku dziennika, a następnie przetworzyć dziennik później (być może w czasie, gdy ruch nie jest tak wysoki). Pod koniec dnia nadal będziesz musiał wykonać wszystkie te zapisy do swojej bazy danych, ale jeśli wsadujesz je razem i robisz je, gdy tego rodzaju obciążenie jest bardziej znośne, twój system będzie skalował się o wiele lepiej.

+1

to nie jest odpowiedź, powinien być komentarzem! – k102

+0

Łącze nie wyjaśniające niczego na temat skalowania. -1 za wprowadzające w błąd. –

+0

+1 To jest dobry link i związany z tematem. Pomoże to OP to przeczytać. – PiTheNumber

-1

Można normalizować wyświetlenia takich danych;

Client Table 
{ 
    ID 
    Name 
} 


Pages Table 
{ 
    ID 
    Page_Name 
} 

PagesClientsVisits Table 
{ 
    ID 
    Client_ID 
    Page_ID 
    Visits 
} 

i tylko przyrostowe wizyty przy stole finałowym przy każdym nowym wyświetleniu. Wtedy maksymalna liczba rekordów się zmienia (Liczba klientów * Liczba stron)

+0

Dziękuję za odpowiedź, ale to nie działa w ten sposób, statystyki są dość głębokie, a tabela przechowuje nowy rekord dla każdej wizyty z IP odwiedzających i kraju, co oznacza, że ​​tak naprawdę nie mogę po prostu napisać liczby w "Odwiedzinach" . – Ricardo

+0

Rozumiem - myślałem, że Twoi klienci są tym samym, co Twoi goście. Można łatwo zastąpić tabelę "Klienci" tabelą "Użytkownicy" i nadal korzystać z tej techniki. Trochę trudno komentować bez lepszego zrozumienia twojej aplikacji. –

-1

Posiadanie stołu z 60 milionami rekordów może być w porządku. Po to jest baza danych. Ale powinieneś uważać na ile pól masz w tabeli. Również jaki typ danych (=> rozmiar) ma każde pole.

Tworzysz raporty na temat danych. Zastanów się, jakie dane naprawdę potrzebujesz do tych raportów. Na przykład możesz potrzebować tylko liczby wizyt na użytkownika na każdej stronie. Prosta liczba wystarczy.

Co można również zrobić, to generować raport co noc, a następnie usuwać surowe dane.

Więc przeczytaj i pomyśl o tym.

+0

Łącze nadal zawiera 0 informacji o skalowaniu bazy danych. –

+0

ładne wyjaśnienie, aby uprościć rzeczy! – linuxeasy

2

Problem z którym się spotykasz to system związany z I/O. 1 milion rekordów dziennie to około 12 zapytań do zapisu na sekundę. Jest to możliwe, ale wyciągnięcie danych podczas pisania w tym samym czasie spowoduje, że twój system zostanie przywiązany na poziomie dysku twardego.

Co należy zrobić, to skonfigurować bazę danych do obsługi woluminu I/O, który będziesz wykonywać, na przykład - użyć odpowiedniego silnika bazy danych (InnoDB, a nie MyISAM), upewnij się, że masz wystarczająco szybki podsystem HDD (RAID , nie są to zwykłe napędy, ponieważ mogą i mogą się nie udać w pewnym momencie), zaprojektuj optymalnie bazę danych, sprawdź zapytania za pomocą EXPLAIN, aby zobaczyć, gdzie mógłbyś się z nimi nie pomylić, może nawet użyj innego mechanizmu magazynowania - osobiście użyłbym TokuDB gdybym był tobą.

Ponadto, mam nadzieję, że będziesz wykonywać zapytania, sortowanie, filtrowanie po stronie bazy danych, a nie po stronie PHP.

+0

Sugerowanie użycia silnika InnoDB jest dla ciebie informacją sprzętową? Ponadto decydujesz się na odpowiedź, która faktycznie pomaga komuś zaprojektować system. Czy w ogóle odpowiadasz na pytania dotyczące SO z takim nastawieniem, które nikomu nie pomaga? –

+0

nie ma problemu ze mną, ale z tobą! wszystko i wszystko może stanowić projekt systemu, bezpośrednio z PHP, sprzętu i po prostu każdy i wszystko! lepiej popraw swoje nastawienie i zmierz się z TAK! – linuxeasy

+0

Przykro mi, ale nie będę wdawał się w takie dziecinne argumenty z kimś, kto najwyraźniej nie ma pojęcia o czym mówi. –

Powiązane problemy