![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 30 Pomógł: 0 Dołączył: 15.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
witam,
istnieje strona tibiaring.com, nie chce nawiazywac do tego o czym gromadzi ona informacje, tylko zapytac czy ma ktos pomysl, w jaki sposob to robi i w jaki sposob w tak szybkim czasie analizuje informacje juz zgromadzone, zrobilem mechanizm pozwalajacy w jakims stopniu przewidziec kto moze miec jaka inna postac bazujac sie na plikach, ktore powstawaly przez ponad miesiac na serverze hostingujacym przy uzyciu crona, tak juz zgromadzone dane 'wrzucilem' do mysql'a struktura mojej bazy wygladala mniej wiecej tak: dla kazdego nowego sprawdzenia (sprawdzanie bylo odnotowywane co 5 minut) powstawala nowa tabela, w tabeli byla jedna kolumna typu varchar o dlugosci ~35 znakow, srednio w kazdej tabeli istnieje 500 rekordow, jesli gromadzilem takie dane przez miesiac, to tabel powstalo ~30*24*(60/5)=30*24*12[skryopt zapisuje dane o graczach online 12 razy na godzine; daje to +/-8640 tabel miesiecznie; napisalem skrypt w php laczacy sie z baza danych nastepnie pobieralem wszystkie tabele z bazy (liste sprawdzen kto byl online i kiedy) wykonywalem petle na kazdej z tabel w bazie w poszukiwaniu danej nazwy gracza, jesli takowa istnieje, skrypt wrzuca roznice zbioru graczy w tabeli, ktora jest aktualnie oraz sasiednich sprawdzen w bazie, czyli mam na mysli ze jesli mamy tabele A,B,C i w tabeli B znaleziono dana nazwe gracza, to B-A oraz A-B oraz B-C oraz C-B wedrowalo do, mmm, nazwijmy to sobie np lista podejrzanych. w tym problem, ze ten caly proces trwa bardzo dlugo (okolo 5-10 minut), czy ma ktos pomysl, w jaki sposob moznaby zmienic strukture bazy czy sam mechanizm, aby to wszystko dzialalo sprawniej? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 26 Dołączył: 19.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Przeszukiwanie bazy trwa długo bo masz ją źle zrobioną. Jak wygląda zapytanie którym pobierasz odpowiednie rekordy (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
EDIT: Mylisz ładowanie bazy do danych z wyszukiwaniem. Rozdzielanie średnikami (przecinkami) następuje podczas ładowania po stronie PHP. Dane trafiają do bazy do odpowiednich pól w rekordach (data,login). Podczas tego przeszukiwania baza nic nie musi dzielić. O ile wszystko siedzi w jednej tabeli (a nie w 250 bo nawet sobie nie wyobrażam zapytania) i masz założony indeks, wyszukiwanie w tak prostej tabeli trwa poniżej 1sek na 1000000 rekordów (tak na oko). EDIT: gotowe rozwiązanie (pewnie nie idealne) ale ma zaletę: nie potrzebuje super szybkiej bazy. Pójdzie na zwykłym MySQL na każdym blaszaku. Tabelę "main" zakładasz taką: seria_id INT // numer serii pomiarów - każda seria co 5 minut ma numer o 1 większy - łatwo to możesz przeliczyć na dokładną godzinę osoba_id INT // identyfikator osoby Tabela wygląda tak: seria_id osoba_id 1 1 2 1 2 2 3 1 3 2 4 3 4 2 5 3 5 2 6 3 6 2 7 3 8 3 9 3 10 1 11 1 12 1 zakładasz dodatkowe tabele: osoby (osoba_id, login) serie (seria_id, czas_pomiaru) Co 5 minut uzupełniasz tabele : 1 wpis do serie, x wpisów do tabeli "main" gdzie x to ilosc osób które w tym czasie policzyłeś dodajesz identyfikatory nowych osób do tabeli osoby. Jak masz założony tam klucz unikalny to robisz to jednym INSERT IGNORE. Teraz najważniejsze: przykładowe zapytanie które pokazuje w którym momencie dana osoba przestała być widoczna: SELECT t1.seria_id, t1.osoba_id, t2.osoba_id FROM(SELECT DISTINCT seria_id, osoba_id FROM main WHERE osoba_id=1) AS t1 LEFT JOIN (SELECT seria_id-1 AS seria_id, osoba_id FROM main WHERE osoba_id=1) AS t2 USING(seria_id) WHERE t1.osoba_id IS NOT NULL AND t2.osoba_id IS NULL Nie sprawdzałem tego, ale powinno działać. Ten post edytował kitol 21.02.2008, 22:19:29 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 9.10.2025 - 13:05 |