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
...
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

