Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Optymalizacja zapytania
MalyKazio
post
Post #1





Grupa: Zarejestrowani
Postów: 168
Pomógł: 1
Dołączył: 19.11.2005

Ostrzeżenie: (0%)
-----


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....
Go to the top of the page
+Quote Post
batman
post
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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).
Go to the top of the page
+Quote Post
AxZx
post
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
batman
post
Post #4





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




@AxZx Chodzi o to, że funkcja rand() musi przemielić całą tabelę, by wyciągnąć losowy wiersz
Go to the top of the page
+Quote Post
MalyKazio
post
Post #5





Grupa: Zarejestrowani
Postów: 168
Pomógł: 1
Dołączył: 19.11.2005

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.09.2025 - 20:21