Temat: Propozycja wydajnego rozwiązania
Piotr Parzentny:
widget, który pokazywać będzie powiedzmy zdjęcie mojej twarzy ;)
:) hehe
Ale wracając do tematu. Może wróć do swego pierwotnego planu czyli tabeli (w skrócie):
- tabela 1 z polami: WEBSITE_ID, COUNTER,
- tabela 2 z polami: WEBSITE_ID, IP, TIME.
Za każdym razem, gdy uruchamia się widget dodajesz rekord do drugiej tabeli dla danej strony. Nie robisz nic więcej - zwykły INSERT. Równocześnie masz utworzone zadanie CRONa (lub nawet na poziomie bazy danych np. event dla MySQL), które co jakiś czas (np. w późnych godzinach nocnych) aktualizuje Ci statystyki na podstawie odwiedzin. Sprowadzi się to do wykonania jednego zapytania UPDATE z wykorzystaniem COUNT dla poszczególnych WEBSITE_ID.
Taki mechanizm wydaje mi się najefektowniejszy.
Jeżeli korzystałbyś z MySQL (a pewnie tak będzie) to rozważ jeszcze te kwestie:
1. Tabela 2 mogłaby być typu MyISAM. Przyspieszyłoby to wprowadzanie nowych rekordów.
2. Wprowadzanie nowych rekordów warto by było wykonywać z flagą DELAYED dla INSERT; nie jest przecież istotne czy rekord pojawi się natychmiast, czy odrobinę później.
3. Rozważyłbym wywalenie jakichkolwiek indeksów z tabeli 2. Dopiero w momencie aktualizacji statystyk możnaby założyć odpowiednie indeksy, a po ich wykonaniu z powrotem je usunąć. Nie wiem w jakim stopniu wpłynie to na wydajność (czy dodawanie indeksu nie będzie bardziej kosztowne niż jego aktualizacja przy każdorazowym INSERcie), ale warto by było spróbować.
4. Zakładam, że adres IP będziesz trzymał w postaci stringa - może lepiej byłoby mieć go w postaci BIGINT?
To chyba tyle z moich koncepcji.