Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: baza - problem z przyrostem i wydajnością
Forum PHP.pl > Forum > Bazy danych > MySQL
golytm
Witam.

Posiadam następujący problem.
Jedna z tabel w mojej bazie danych posiadająca 21 kolumn przechowuje dane statystyczne. Na chwilę obecną posiada około 30 000 rekordów. Wyszukiwanie w tejże tabeli następuje głównie względem kolumny 'domain' (łączna liczba różnych 'domain' to 42 i co jakichś czas się zwiększa). Średni przyrost bazy to około 3000 rekordów miesięcznie - przyrost wykazuje tendencje rosnącą.
Oczywiście pojawił się problem wydajności bazy i czasu otrzymywania wyników z zapytań.
W związku z powyższym zabieram się za optymalizację mechanizmów obsługi tej bazy. Stąd moja prośba o Wasze opinie, propozycje. Zastanawiam się nad następującymi rozwiązaniami:

1. Tabela przechowuje rekordy tylko z ostatnich 3 miesięcy (mniej więcej tyle muszę mieć "od ręki" dostępne z zapytania do bazy), wszystkie starsze rekordy zrzucane byłyby do archiwum. Jakie to archiwum? pliki xml? Do danych z archiwum też muszę mieć dostęp, choć zakłam, że dane z niego nie będą potrzebne dość często.

2. Każda z 'domain' posiada oddzielną przypisaną tabelę ze statystykami. Liczba tabel zwiększała by się zatem z czasem (jak pisałem wcześniej ilość 'domain' także rośnie)

3. Rezygnacja z tabeli na rzecz przechowywania danych w plikach np xml i parsowania ich w trakcie zapytań (najmniej odpowiadająca mi opcja)

Jakie jest Wasze zdanie? Co proponujecie ?


Z góry dziękuję za odpowiedzi

Wojtek
javafxdev
30k rekordów i już problem z wydajnością? Pokaż jakie zapytania wykonujesz?
Pyton_000
1. bez sensu. Zacznij o tym myśleć dopiero jak ilość danych będzie na prawdę spora. Np. po roku możesz sobie przenieść do takiej samej tabeli tylko nazwanej np. archive_cóśtam.
2. Kolejny błąd. Duplikujesz tabele. Nie ma to najmniejszego sensu.
3. Również bez sensu bo utrudnia Ci to pracę.

Pokaż strukturę tabeli, pokaż zapytania. Podejrzewam że odpowiednie nałożenie indeksów pozwoli Ci poprawić znacząco wydajność. 30k rekordów to bardzo mało więc ewidentnie masz skopaną strukturę.
golytm
Hej,

Poniżej struktura:

CREATE TABLE `test` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`build` text NOT NULL,
`start_date` date NOT NULL,
`start_time` time NOT NULL,
`duration` text NOT NULL,
`pass_ts` int(255) NOT NULL,
`fail_ts` int(255) NOT NULL,
`pass_tc` int(255) NOT NULL,
`fail_tc` int(255) NOT NULL,
`file` varchar(255) NOT NULL,
`total_tc` int(255) NOT NULL,
`total_ts` int(255) NOT NULL,
`track` varchar(10) NOT NULL,
`comments` text,
`group_comments` text,
`release` int(10) NOT NULL,
`release_name` text,
`release_info` text,
`release_comments` text,
`index_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`execution_id`)
) ENGINE=InnoDB AUTO_INCREMENT=33168 DEFAULT CHARSET=utf8;

Zapytania są tylko:
"SELECT * FROM test WHERE name=''"
Pyton_000
Nie masz żadnego indeksu na "name", załóż a dostaniesz kopa.
javafxdev
ogólnie to co wkleiłeś chyba nie zadziała - PRIMARY KEY (`execution_id`) natomiast tabelka nie ma kolumny execution_id więc musi to być jakaś ściema z tą strukturą wink.gif - do tego może trzeba zmienić typ kolumny name - na pewno ładujesz tam niewiadomo jak długie teksty?
golytm
Hej,

Dzięki za odpowiedz. Nie ściema, choć faktycznie tak to wygląda - ten primary key wklejony był z innej struktury przez przypadek. Powinno być 'id'.
Co do długości to faktycznie można ją zmniejszyć.

BR
Wojtek
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.