ďťż

[PHP] Pobieranie rekordów i ich liczby 2 rozwiązania, które bardziej wydajne?

       

Podstrony


telcocafe

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

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.