Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] ORDER BY RAND() - optymalizacja
boro11
post
Post #1





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 9.07.2010
Skąd: Warszawa

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


Witam!
Mam kod, który aktualizuje mi dane na stronie ale wykonuje się on dosyć długo ze względu na złożoność operacji jaką musi wykonać. Postanowiłem podzielić proces na pare razy przy użyciu ORDER BY RAND() i LIMIT. Strona działa dwa razy szybciej, ale gdzie nie spojrzę ORDER BY RAND() jest krytykowane z każdej strony. W normalnym zapytaniu aktualizowane są dane około 150 elementów, przy rand dałem limit 25.
Drugą sprawę jest, że nie do końca rozumiem zapis tego kodu, dodałem komentarze tam gdzie wiem co się dzieję, a tam gdzie nie mam nadzieje że mi ktoś wyjaśni wtedy może będę miał możliwośc zrobienia czego samemu.

Kod:

  1. $sites = array();
  2. $limits = array();
  3. $count = array();
  4. //Pobieranie listy obiektów do aktualizacji
  5. $zap=array(1 => 'SELECT',2 => 'nazwa, limits',3 => 'FROM',4 => 'test_site', 5 => 'ORDER BY RAND() LIMIT 25');
  6. $query = $db->zap($zap);
  7.  
  8. while ($row = mysql_fetch_array($query))
  9. {
  10. //Podejrzewam, że słuzy do zliczania, ale nie wiem jak to się odbywa - ktoś mógłby mi wyjaśnić. Jeśli nie do zliczania to do czego??
  11. $sites [$row['nazwa']] = $row['nazwa'];
  12. $limits [$row['nazwa']] = $row['limits'];
  13. $count [$row['nazwa']] = 0;
  14. }
  15.  
  16. $zap2=array(1 => 'SELECT',2 => 'site',3 => 'FROM',4 => 'test_sites',5 => 'WHERE ((status = "Approved") OR (status = "Pending"))');
  17. $quer = $db->zap($zap2);
  18. while ($row2 = mysql_fetch_array($quer))
  19. {
  20. //Co sprawdza ten zapis?
  21. if (in_array($row2['site'],$sites)) $count[$row2['site']]++;
  22.  
  23. if (($count[$row2['site']] > $limits[$row2['site']]) && ($limits[$row2['site']] != '~') && ($limits[$row2['site']]!='') && ($limits[$row2['site']]!='0'))
  24. {
  25. //Przenosi obiek do kategorii LIMITED jeśli jest spełniony warunek powyżej tj. limit został wyczerpany np. 100/100
  26. $zap3=array(1 => 'UPDATE',2 => 'test_site',3 => 'SET',4 => 'status="LIMITED"',5 => 'WHERE ((nazwa="'.$row2['site'].'") AND (status<>"SCAM"))');
  27. $db->zap($zap3);
  28. }
  29. }
  30. //Aktualizuje licznik, który znajduje się w polu "refkow" do postaci ZZ/LL, gdzie ZZ - to zapisani, a LL - to limit
  31. $zap=array(1 => 'SELECT',2 => 'nazwa, limits',3 => 'FROM',4 => 'test_site');
  32. $query2 = $db->zap($zap);
  33. while ($row2 = mysql_fetch_array($query2))
  34. {
  35. if (isset($count[$row2['nazwa']])) $put = $count[$row2['nazwa']].'/'.$row2['limits'];
  36. else $put = '0/'.$row2['limits'];
  37. $zap=array(1 => 'UPDATE',2 => 'test_site',3 => 'SET',4 => 'refkow = "'.$put.'"',5 => 'WHERE nazwa="'.$row2['nazwa'].'"');
  38. $db->zap($zap);
  39. }


Struktura w bazie danych oraz nałożone indeksy:


test_site(lista obiektów do których można się zapisać):

(IMG:http://clip2net.com/clip/m106573/thumb640/1387410487-clip-234kb.png)

test_sites(tutaj znajduję się liczone zapisy):

(IMG:http://clip2net.com/clip/m106573/thumb640/1387410544-clip-86kb.png)


Go to the top of the page
+Quote Post

Posty w temacie


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: 2.10.2025 - 18:15