Paweł Kubasiak

Paweł Kubasiak Artysta Programista

Temat: Problem z optymalizacją MySQL

Witam mam taki schemat bazy danych :


CREATE TABLE IF NOT EXISTS `directory` (
`id_directory` int(11) NOT NULL,
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id_directory`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `project` (
`id_project` int(11) NOT NULL AUTO_INCREMENT,
`id_user` int(11) NOT NULL,
`id_database` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`description` text,
`site_url` varchar(100) DEFAULT NULL,
`site_title` varchar(100) DEFAULT NULL,
`site_description` text,
`site_keywords` varchar(255) DEFAULT NULL,
`site_keywords_value` int(11) DEFAULT NULL,
`site_email` varchar(100) DEFAULT NULL,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id_project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `project_direcory` (
`id_project` int(11) NOT NULL,
`id_directory` int(11) NOT NULL,
`status` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id_project`,`id_directory`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;





Moje pytanie brzmi : zakładając że w tabeli directory bede miał około 7 tysięcy wierszy w tabeli project_direcory będzie mega dużo powiązań załóżmy że pojawi się tylko 100 projektów a liczba wpisów w tabeli project_direcory będzie wynosiła 7000*100 = 700 000. Jak to inaczej można rozwiązać ??

myślałem żeby w tabeli direcory wprowadzić np. nowe pole tekstowe status_success gdzie bym wpisywał po przecinku czy innym znaku id projektów. Ale jak po takiej polu później coś wyszukać ??

w celu zobrazowania jak wyobrażam sobie taką tabele direcory po modyfikacji :

CREATE TABLE IF NOT EXISTS `directory` (
`id_directory` int(11) NOT NULL,
`url` varchar(45) DEFAULT NULL,
`staus_success` text,
`staus_error` text,
PRIMARY KEY (`id_directory`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



i status_success wypełniał bym tak : 34,12,12,45,21,
gdzie liczy po przecinkach to id projektów;


Czy to dobry sposób na optymalizacje tej tabeli project_direcory ??
jak wyszukiwać potem id w polu status_success ????


Z góry dzięki za odp.
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Problem z optymalizacją MySQL

Wpisywanie do pola id projektów oddzielonych przecinkami to zdecydowanie zły pomysł.

Projekt jest całkiem dobry, tylko można pomyśleć nad polem "status" w tabeli project_directory - na pewno dodać indeks, żeby przyspieszyć wyszukiwanie a można też pomyśleć nad zmianą na typ INT (albo w ogóle wartość 1/0 czyli sukces/porażka, albo skończona ilość statusów liczbowych + dodatkowa tabela jako ich "słownik").
Te 700 tys. rekordów to przypadek pesymistyczny, gdy każdy rekord z tabeli "project" będzie powiązany ze wszystkimi rekordami tabeli "directory" - a czy tak będzie na pewno?
Przy prostej strukturze tabeli "project_directory" (np. 3 pola typu INT) i założonych indeksach te 700 tys. rekordów nie jest jakąś straszną ilością.
Paweł Kubasiak

Paweł Kubasiak Artysta Programista

Temat: Problem z optymalizacją MySQL

Maciej Niedźwiecki:
Wpisywanie do pola id projektów oddzielonych przecinkami to zdecydowanie zły pomysł.

Projekt jest całkiem dobry, tylko można pomyśleć nad polem "status" w tabeli project_directory - na pewno dodać indeks, żeby przyspieszyć wyszukiwanie a można też pomyśleć nad zmianą na typ INT (albo w ogóle wartość 1/0 czyli sukces/porażka, albo skończona ilość statusów liczbowych + dodatkowa tabela jako ich "słownik").
Te 700 tys. rekordów to przypadek pesymistyczny, gdy każdy rekord z tabeli "project" będzie powiązany ze wszystkimi rekordami tabeli "directory" - a czy tak będzie na pewno?
Przy prostej strukturze tabeli "project_directory" (np. 3 pola typu INT) i założonych indeksach te 700 tys. rekordów nie jest jakąś straszną ilością.

no tak tylko te 700 tysięcy będzie przy zaledwie 100 projektach przy 1000 robi się już 7 milionów. Oczywiście indeksy wszędzie będą pozakładane, tylko przeraża mnie ta ogromna liczba wpisów. Oczywiście tak jak wspomniałeś 7 tysięcy wpisów przy jednym projekcie to pesymistyczne założenie ale wole się upewnić niż potem płakać i przerabiać bazę.

Temat: Problem z optymalizacją MySQL

Wszystko zależy od tego jakich czasów oczekujesz od bazy, jak będzie wyglądał przyrost danych w czasie, na jaką pojemność (ilość rekordów) baza jest projektowana, na moje oko to jest optymalne rozwiązanie, oczywiście nie zarysowałeś problemu więc możemy się tylko domyślać czego ta baza dotyczy, ale przykładowo jeżeli każdy polak miałby 10 różnych samochodów to mamy (dla 40mln polaków) 400mln powiązań i nie da się tego lepiej/wydajniej zrobić. Przy 7mln indeksowanych rekordów tragedii nie ma, zarówno przy pojedynczych indeksach jak i parach, tutaj wg. mnie jedyna możliwa optymalizacja to lepszy/wydajniejszy serwer bazy ;)

PS Wpisywanie id po przecinku to bardzo kiepski pomysł, nie spełniasz definicji 1NF (pierwszej postaci normalnej) odnośnie atomowości (niepodzielności) komórek, a każda baza (z tego co pamiętam) powinna być co najmniej w 3NF
Paweł G.

Paweł G. Managing Director

Temat: Problem z optymalizacją MySQL

Wpisywanie id projektów po przecinku to zły pomysł. Przeszukiwanie tego potem to byłaby masakra :)

Struktura bazy wydaje się raczej optymalna, trudno to lepiej rozwiązać. Zastanów się jednak nad typami pól, bo to wbrew pozorom jest bardzo istotne, szczególnie dla tabel z dużą ilością danych. Skoro piszesz, że w directory będzie jakieś 7 tysięcy rekordów, to INT tam nie jest potrzebny. Może wystarczyłby SMALLINT lub MEDIUMINT?

Następna dyskusja:

MySQL Workbench problem z d...




Wyślij zaproszenie do