Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolejne zapytanie o dwie tabele - wydajność
Forum PHP.pl > Forum > Bazy danych > MySQL
schizoos
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.
5k7
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.