![]() |
![]() ![]() |
![]() |
![]() ![]()
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 ![]() ![]() |
|
|
![]()
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.07.2025 - 14:18 |