Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
MalyKazio
Witam,

Mam pewien problem z banalnym zapytaniem. Calosc wyglada tak:

SELECT * FROM psy ORDER BY rand() LIMIT 1;

Niestety dla wyswietlenia tego jednego rekordu pobiera mi wszystkie wiersze z bazy danych. Czy da sie cos zrobic alby ograniczyc ilosc pobieranych wierszy? Nie bez znaczenia jest tych 1000 niepotrzebnych wierszy....
batman
Jeśli chcesz wyciągnąć losowy wiersz, to niestety musisz przelecieć całą tabelę. Można to rozwiązać w nieco inny sposób. Jeśli używasz php, możesz dokonać losowania w skrypcie (musisz jednak wiedzieć jakie id występują w tabeli), a następnie wyciągnąć jeden wiersz (dla wylosowanego wcześniej id). W samym MySQL nie da się tego zrobić (przynajmniej tak mi się wydaje).
AxZx
Cytat(MalyKazio @ 15.11.2006, 21:52:47 ) *
Witam,

Mam pewien problem z banalnym zapytaniem. Calosc wyglada tak:

SELECT * FROM psy ORDER BY rand() LIMIT 1;

Niestety dla wyswietlenia tego jednego rekordu pobiera mi wszystkie wiersze z bazy danych. Czy da sie cos zrobic alby ograniczyc ilosc pobieranych wierszy? Nie bez znaczenia jest tych 1000 niepotrzebnych wierszy....


nie rozumiem, dajesz limit 1 i pobiera ci 1000 innych wierszy?
ja to twoje zapytanie wpisalem u siebie i wyrzucilo mi jeden wiersz.
batman
@AxZx Chodzi o to, że funkcja rand() musi przemielić całą tabelę, by wyciągnąć losowy wiersz
MalyKazio
Zgadza się, chodzi o to że mieli całą tabelę a ostatnio home.pl wziął się za sprawdzanie wykorzystania bazy i zwrócili mi uwagę, że z 1000 pobieranych rekordow tylko jeden jest potrzebny w związku z czym przydałoby się to poprawić. Wymyśliłem rozwiązanie wyjątkowo nieeleganckie ale na lepsze nie wpadłem. Teraz zamiast jednego zapytania mam 3 ale trudno...

  1. <?php
  2. $query = "SELECT MAX(nr) as numer FROM psy WHERE edycja = 0";
  3. $wynik = mysql_query($query);
  4. while ($row = mysql_fetch_assoc($wynik)) {
  5. $maxnumer=$row[numer];
  6. }
  7.  
  8. $liczba=rand(1, $maxnumer);
  9.  
  10. $query = "SELECT * FROM psy WHERE nr=$liczba";
  11. $wynik = mysql_query($query);
  12. $znaleziono = mysql_num_rows($wynik);
  13. if($znaleziono==0) {
  14. $liczba=rand(1, $maxnumer);
  15. $query = "SELECT * FROM psy WHERE nr=$liczba";
  16. $wynik = mysql_query($query);
  17. $znaleziono = mysql_num_rows($wynik);
  18. if($znaleziono==0) {
  19. $query = "SELECT * FROM psy WHERE nr=1";
  20. $wynik = mysql_query($query);
  21. }
  22. }
  23.  
  24. while ($row = mysql_fetch_assoc($wynik)) {
  25. ?>


Działa choć kod jest obrzydliwy smile.gif
Ponowne losowanie wybrałem dlatego, że dość często wybierało mi 1 rekord.

Kolejne pytanie. Czy warto zmienić typ pola z TEXT na VARCHAR jesli przechowywane są tam dane nie dłuższe niż 255 znaków?
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.