Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kolejne zapytanie o dwie tabele - wydajność
schizoos
post 11.10.2011, 19:35:59
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 21.11.2009

Ostrzeżenie: (0%)
-----


Mam dwie tabele, które w skrócie wyglądają tak:

Kod
TABELA PRODUKTY
id | nazwa | sku | status
1 | rower | 001 | 1
2 | łyżka | 002 | 1
3 | auto  | 003 | 0
....

TABELA CECHY
id | c_sku | c_cecha | c_wartosc
1 |   001 | kolor   | czerwony
2 |   002 | kolor   | zielony
3 |   001 | waga    | 100g
4 |   001 | cena    | 80zł
5 |   001 | ilosc   | 40
6 |   002 | waga    | 100g
7 |   002 | cena    | 80zł
8 |   002 | ilosc   | 40
9 |   002 | kolor   | zielony
...


itp. Oczywiście tabele są inne, produkty zawierają około 10 kolumn, w przykładowej tabeli dodałem ich około 500, do każdego z produktów jest dopisanych około 20tu cech. Robi się tego miażdżąco dużo (20x500 - ok. 10000 wierszy w drugiej tabeli do przeszukania)...

I teraz tak: zaczynam wyświetlać listę produktów z paginacją na podstawie count. Łączenie tabel przez LEFT lub INNER JOIN - działa w zasadzie bez problemu i wyświetla mi tablicę, jakiej potrzebuję. W pewnym momencie dochodzą jednak do tego filtry na podstawie danych przesyłanych przez $_POST a określających konkretne cechy. I... Jest klops.

Przykładowe zapytanie w formie słownej:
Pokaż wszystkie produkty z tabeli PRODUKTY, gdzie status wynosi 1, a wymagane cechy tego produktu z tabeli CECHY to kolor, którego wartość to czerwony, waga, której wartość to 100g i ilość, której wartość to 40.

W moich zapytaniach wygląda to mniej więcej tak (przykładowo):

SELECT COUNT(*) FROM $tb_product LEFT JOIN $tb_product_attribute cechy ON sku=cechy.c_sku WHERE status = '1' AND cechy.c_cecha = 'kolor' AND cechy.c_wartosc = 'czerwony' GROUP BY cechy.c_cecha

I teraz borykam się z dwoma problemami:
- wspomniany czas zapytania
- sytuacja, w której mam do wyciągnięcia więcej cech produktu, czyli chcę wyciągnąć id z tabeli PRODUKTY produktów, które mają kolor oznaczony jako czerwony, wagę jako 100g a ilość jako 40. Próbowałem to zrobić jako subselect i działa, ale czas zapytania jest po prostu potworny - około 2 minut przy tej ilości produktów, na localhoście...




Kwestia kolejna: czy lepiej zrobić w takiej sytuacji:
SELECT COUNT(*) FROM $tb_product ...
a potem do wyciągnięcia produktów ponowić to zapytanie tylko z określeniem LIMIT (celem wyświetlenia w paginacji tylko 10 produktów na stronę):
SELECT * FROM $tb_product ... LIMIT 10

czy lepiej od razu pobierać wszystkie dane za pomocą
SELECT * FROM $tb_product ...
bez limitu i później filtrować wyświetlanie pokazując tylko 10? Co będzie bardziej optymalne dla serwera?


Z góry dziękuję za wszelkie podpowiedzi smile.gif. Temat dla mnie miażdżąco pilny smile.gif.
Go to the top of the page
+Quote Post
5k7
post 14.10.2011, 12:26:56
Post #2





Grupa: Zarejestrowani
Postów: 65
Pomógł: 2
Dołączył: 5.12.2006

Ostrzeżenie: (0%)
-----


Sprawa dosyć skomplikowana i na pewno każdy będzie miał coś innego do powiedzenia. Musisz wiedzieć co i jak masz zrobić. Indexy przyspieszają wyszukiwanie do 100x, ale musisz mieć odpowiednie zapytania i podstawowa więdze na temat konkretnych silników i rozwiązań które tam panują ; ). Rozważyć możesz użycie tabel typu MEMORY itd.

Polecam podstawową lekturę na mysql ; )
http://dev.mysql.com/doc/refman/5.0/en/opt...on-indexes.html

Ten post edytował 5k7 14.10.2011, 12:28:00
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 14:18