![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 27.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Opiszę problem: tabela: produkt produkt2sklep (8mln) sklep (40tys) (posiada pole id_sieci) siec (200) Gdy chcę pobrać produkty należące do danej sieci, robie (w uproszczeniu): product JOIN produkt2sklep JOIN sklep JOIN siec (poniewaz sklep jest przypisany do sieci, a produkt do sklepu poprzez tabele produkt2sklep). Poniewaz w ostatnim czasie bardzo rozrosła sie tabela produkt2sklep czas zapytan wzrósł do kilku sekund, a to stanowczo za duzo. Dodam, że używam indexów tam, gdzie potrzeba. ROZWIAZANIE? Czy dodac tabele product2siec, ktora bylaby uzywana tylko do tego zapytania? Chyba najwiekszym minusem tego rozwiazania jest utrata integralności, bo wtedy produkt jest przypisany do sieci poprzez bezposrednie polaczenie nową tabela, oraz przez stare polaczenie poprzez tabele sklep. Plusem natomiast jest to, ze biorac pod uwage ilosci wierszy w tabeli siec i produkt2sklep rozwiazanie to (wg mnie) znacznie skrociloby czas wykonywania zapytania. Dla dbania o integralnosc pomyslalem, ze mozna codziennie uruchamiac skrypt, ktory bedzie aktualizowal tabele produkt2siec, zeby zawarte w niej dane byly zawsze zgodne z reszta bazy. Co o tym myslicie? Może macie inne pomysły na rozwiazanie tego problemu? Ten post edytował madar 15.07.2011, 11:27:54 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
1) struktura tabel
2) zapytanie 3) moc indeksów Tego nam brakuje do powiedzenia czegokolwiek więcej.
Powód edycji: [wookieb]:
|
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
4) EXPLAIN (chyba że pod 3 to miałeś na myśli (IMG:style_emoticons/default/smile.gif) )
ps: produkt może należeć do kilku sklepów? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 27.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tak, produkt jest przypisany do wielu sklepów, a kazdy sklep jest przypisany do jednej sieci. poniewaz produkt jets przypsiany do wielu sklepow, to tabela produkt2sklep rozrosla sie do takiej wielkosci.
W każdym razie obrazowo tabele wygladaja tak: PRODUKT id_produktu ... SKLEP id_sklepu nazwa id_sieci ... SIEC id_sieci ... PRODUKT2SKLEP id_produktu id_sklepu Tabela, ktora chce wprowadzic to: PRODUKT2SIEC id_produktu id_sieci ZAPYTANIE (pseudokod): SELECT * FROM produkt INNER JOIN produkt2sklep ON id_produktu=id_produktu INNER JOIN sklep ON id_sklepu=id_sklepu INNER JOIN siec on id_sieci=id_sieci WHERE id_sieci=8 A po amianach byloby: SELECT * FROM produkt INNER JOIN produkt2siec ON id_sieci=id_sieci INNER JOIN siec on id_sieci=id_sieci WHERE id_sieci=8 Pobieram wybrane kolumny, nie wszystkie. Indexy sa nalozone na wszytskich polach, ktore sa pobierane i uzywane w WHERE i JOIN. Przejalem ten projekt, moce indexow sa poustawiane przez innych, musze doczytac o ich istotnosci - czy moc indexow duzo zmienia? Ten post edytował madar 15.07.2011, 11:27:22 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 159 Pomógł: 5 Dołączył: 31.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
jakie to typy tabel?
masz klucze, indeksy pozakladane? Jeśli tak to może za mało komumn jest powstawianych do indeksów... jeśli masz innodb to może "klucze obce" wykorzystaj - nie wiem czy coś tu pomogą, ale nie zaszkodzą... |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat indeksy pozakladane? Nie nie zakładał. Przecież napisał tylko:Cytat Dodam, że używam indexów tam, gdzie potrzeba. Cytat Indexy sa nalozone na wszytskich polach, ktore sa pobierane i uzywane w WHERE i JOIN. @madar prosiłem jeszcze o EXPLAIN z zapytania |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
To, że założysz indeks na kazdym polu kompletnie nic nie znaczy.
1) strukture tabeli pokazuje się w ten sposób
I wklejasz nam 2) Indeksy oraz moc pokazujesz w ten sposób http://dev.mysql.com/doc/refman/5.0/en/show-index.html 3) a gdzie explain z zapytania? 4) P.s 8mln to nie jest tak dużo danych |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 27.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ok, chcialem uniknac wnikania w faktyczna strukture bazy, ale chyba nie obejdzie sie bez tego. Ponizej potrzebne dane. Tabela "visit" to produkty, "site" to sklepy. Jesli cos bedzie niezrozumiale prosze o info
(sorry za format tego ponizej...) id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE network const PRIMARY PRIMARY 4 const 1 Using temporary; Using filesort 1 SIMPLE s1 ref PRIMARY,s_network s_network 5 const 143 Using where 1 SIMPLE visit2shop ref v2s_shop,v2s_prod v2s_shop 4 hiper_stage.s1.site_id 457 1 SIMPLE visit eq_ref PRIMARY,id_product_v,id_p2s_v,date_to_v,date_from_... PRIMARY 8 hiper_stage.visit2shop.v2s_visit 1 Using where 1 SIMPLE prod2seg eq_ref PRIMARY,unikalny,p2s_segment,p2s_product PRIMARY 4 hiper_stage.visit.id_p2s_v 1 Using where 1 SIMPLE product eq_ref PRIMARY PRIMARY 4 hiper_stage.prod2seg.p2s_product 1 1 SIMPLE segment eq_ref PRIMARY PRIMARY 4 hiper_stage.prod2seg.p2s_segment 1 Using index zrzut explaina: (IMG:http://www.image-share.com/upload/776/295.png) (IMG:http://www.image-share.com/upload/777/10.png) Widzę, że jednak opis jest zbyt szczegółowy. Tak czy inaczej zdecydowałem się na wykorzystanie dodatkwoej tabeli - wykonanie zapytania trwa teraz około 100 razy szybciej (srednio z 3 s na 0,03s), co jest juz dla mnei zadowalajacym wynikiem i póki co tak to zostawię. Ten post edytował madar 15.07.2011, 13:11:34 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 00:11 |