Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dlugi czas wykonywania zapytania na rozbudowanej bazie, Co myślicie o takim rozwiazaniu?
madar
post
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
madar
post
Post #2





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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 05:58