golytm
21.02.2017, 01:17:46
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
21.02.2017, 08:21:13
30k rekordów i już problem z wydajnością? Pokaż jakie zapytania wykonujesz?
Pyton_000
21.02.2017, 08:33:54
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
21.02.2017, 09:49:52
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
21.02.2017, 10:32:02
Nie masz żadnego indeksu na "name", załóż a dostaniesz kopa.
javafxdev
21.02.2017, 12:53:39
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ą

- do tego może trzeba zmienić typ kolumny name - na pewno ładujesz tam niewiadomo jak długie teksty?
golytm
21.02.2017, 15:40:42
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.