ďťż
Podstrony
|
telcocafeMam tabelę, w której przechowuje dużą liczbę rekordów, znajdują się w niej kolumny przechowujące liczby, ale także duże ciągi znaków. Kiedy dane te wyświetlam na stronie, to potrzebna mi jest tylko określona ich ilość (w zależności od "suwaka" - strona ,1 strona 2, itd do samego konca). Wyświetlam też ilość oznaczającą ilość wszystkich rekordów. Mam dylemat które rozwiązanie jest bardziej wydajne:1. W pierwszym zapytaniu SELECT COUNT() pobieram ilość wszystkich rekordów, a w drugim z odpowiednimi warunkami i parametrem LIMIT (np. LIMIT 0, 20) odpowiednie rekordy i odpowiednią ich ilość 2. Pobieram wszystko SELECT * FROM... i potem w PHP wyciągam ich ilość (mysql_num_rows) i wyświetlam tylko te, które są mi potrzebne Oba rozwiązania mają swoje wady. W pierwszym mam 2 zapytania do bazy, a warunek WHERE jest skomplikowany. Jednym słowem 2 razy wykonuję podobne zapytanie. Natomiast drugie rozwiązanie może przeciążyć serwer, gdyż jak powiedziałem wcześniej danych jest dużo. I moje pytanie brzmi, które rozwiązanie jest lepsze? Krótko: pierwsze. Długo: pierwsze nie ma takich wad. W przykładowym, krótkim zapytaniu nie ma żadnych warunków: SELECT * FROM tabelka LIMIT 25; To po pierwsze. Po drugie: nie trzeba robić pierwszego zapytania, chyba że naprawdę potrzebujesz. Choć i wtedy można połączyć: SELECT COUNT(*) AS rows_count, * FROM tabelka LIMIT 1 20; A co do drugiego sposobu: PHP jest mniej wydajne od MySQL. :) Zdecydowanie pierwsze :). Przy drugim zabijesz bazę jak danych będzie dużo, a poza tym php zabije skrypt jak przekroczysz pamięć. Nie używaj gwiazdki, to jest nieoptymalne. SELECT COUNT(*) AS rows_count, * FROM tabelka LIMIT 1 20; Jak wyżej, pobieranie gwiazdką wszytkich kolumn jest bez sensu oraz count(*) to już w ogóle. Lepiej użyć np. count(id), by pobrać tylko jedną kolumnę. A co do drugiego sposobu: PHP jest mniej wydajne od MySQL. :) Nie przesadzaj, wszystko zależy głównie od tego, jak napiszesz zapytania i kod. -- No i oczywiście, lepsze jest rozwiązanie 1. A i napisałeś o wadach pierwszego rozwiązania - bagatelizujesz Użytkownik Coldpeer edytował ten post 21 czerwiec 2007, 17:32 Jak wyżej, pobieranie gwiazdką wszytkich kolumn jest bez sensu oraz count(*) to już w ogóle. Lepiej użyć np. count(id), by pobrać tylko jedną kolumnę. No sorry, ale nie znam układu jego bazy :P Wielkie dzięki za pomoc, teraz już nie mam wątpliwości. No i pbnan już któryś raz z kolei mi pokazuje prostą rzecz, na którą jakoś nie wpadłem sam ;] No i pojawił się problem. Mam powiedzmy takie zapytanie: SELECT DISTINCT actived.* FROM actived, contacts WHERE actived.cat="'.$cat_id.'" AND (actived.visibility!=1 OR (actived.visibility=1 AND actived.user="'.$_SESSION['login'].'") OR (actived.visibility=1 AND contacts.contacter="'.$_SESSION['login'].'" AND contacts.user=actived.user)) ORDER BY actived.dateact DESC LIMIT 0, 16' właśnie to zapytanie mi pobiera dane. Chciałem dodać również liczenie wszystkich rekordów w jednym zapytaniu, tak jak powiedział pbnan, dlatego dodałem: SELECT DISTINCT actived.*, COUNT(actived.id) FROM ... ale wywala błąd o braku GROUP BY. Szczerze powiedziawszy nie stosowałem jeszcze tak "zaawansowanych" zapytań i trochę się gubię. Poczytałem kursik (a konkretnie temat o GROUP BY), ale jakoś nie potrafię tego zaimplementować w tym zapytaniu. Jak będzie w takim razie wyglądało działające zapytanie? Użytkownik kutar edytował ten post 21 czerwiec 2007, 19:44 funkcje jak count, max, min muszą zawierać klauzulę group by. Dodaj na końcu zapytania, np.: GROUP BY actived.id Użytkownik Coldpeer edytował ten post 21 czerwiec 2007, 22:15 funkcje jak count, max, min muszą zawierać klauzulę group by. To akurat wiem. GROUP BY actived.id Tiaa.. tylko to mi pokazuje 3 rekordy, jak w bazie mam 33 :P Tiaa.. tylko to mi pokazuje 3 rekordy, jak w bazie mam 33 :P powtarzaja ci sie id? musisz grupowac po czyms co jest unikalne jak chcesz uzyskac ilosc wszystkich rekordow powtarzaja ci sie id? Oczywiście, że nie. ID jest auto_increment i PRIMARY KEY Może coś więcej napiszę. Może źle zapisuję wiersze wyników do zmiennych. Otóż w każdej iteracji pętli while($rekord=mysql_fetch_array($wynik)) zmienna zawierająca liczbę wszystkich rekordów przyjmuje wartość 3, a obecnie wszystkich rekordów jest 33. |
|||
Sitedesign by AltusUmbrae. |