Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z prędkością wykonywania zapytania, Przepisanie wartości jednej kolumny do drugiej
Radek_1
post
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 9.09.2003
Skąd: Bełchatów

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


Witam,

mam problem z prędkością wykonywania zapytania.
Cron uruchamia skrypt codziennie i jeżeli zajdą pewne warunki to przepisuje wartości z jednej kolumny do drugiej. W tabeli jest póki co ok. 37 tyś rekordów. Problem w tym, że przepisywanie trwa bardzo długo, tj. tylko 2tyś rekordów na minutę. Wydawało mi się, że taka nieskomplikowana rzecz powinna trwać parę sekund.
Na początku myślałem, że to wina pythona, dlatego przepisałem to na php, ale wciąż to samo.

Sam kod do przepisywania wygląda tak:
  1. $sql="SELECT current_month, name FROM time_online WHERE current_month>0";
  2. $query = mysql_db_query($db_database, $sql);
  3. while ($high = mysql_fetch_array($query)) {
  4. mysql_query("UPDATE time_online SET last_month='".$high[0]."', current_month='0' WHERE name='".$high[1]."'");
  5. }


Całość wykonuje się na serwerach home.pl, więc nie powinno być dużych opóźnień. Co o tym sądzicie? Da się to jakoś przyspieszyć, czy taka "prędkość" to norma?


Edit:
Zmieniłem warunek po którym edytujemy wpisy z name na uid i... idzie o niebo szybciej. Taki głupi błąd :/

Ten post edytował Radek_1 1.09.2011, 20:32:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Nie zrozumiałeś mnie, mysql_affected_rows() używamy, aby uzyskać liczbę rekordów zmienionych przez zapytanie z INSERT, UPDATE, REPLACE i DELETE. Inaczej nie możemy tej liczby uzyskać, bo powyższe zapytania nie zwracają żadnych rekordów.
Natomiast mysql_num_rows() możemy użyć, jeśli chcemy uzyskać liczbę rekordów pobranych za pomocą SELECT. Funkcja ta jest jednak wolna.
  1. // wariant szybszy$sql = "SELECT COUNT(*) AS `rows` FROM `table`";
  2. $result = mysql_query($sql);
  3. $row = mysql_fetch_assoc($result)
  4. $rowsNumber = $row['rows'];
  5. // wariant wolniejszy
  6. $sql = "SELECT * FROM `table`";
  7. $result = mysql_query($sql);
  8. $rowsNumber = mysql_num_rows($result);
  9.  
  10. // natomiast mysql_affected_rows() używamy dla zapytań z INSERT, UPDATE, REPLACE lub DELETE
  11. // zapytanie aktualizuje czas przebywania online użytkownika o nazwie $name_p
  12. $sql = "UPDATE time_online SET ".$dzien_tyg."=".$dzien_tyg."+15, current_month=current_month+15, online='1' WHERE name='".$name_p."'";
  13. $result = mysql_query($sql);
  14. // sprawdzamy, czy jakieś rekordy zostały zaktualizowane i jeśli nie został zaktualizowany żaden rekord, to poniższy warunek jest spełniony
  15. if(mysql_affected_rows($result) == 0) {
  16. // co oznacza, że użytkownik o nazwie $name_p jeszcze w naszej tabeli nie istnieje i musimy go dodać
  17. mysql_query("INSERT INTO time_online SET name='".$name_p."', current_month='15', online='1', ".$dzien_tyg."='15'");
  18. }

Akurat Twój skrypt to szczególny przypadek, w którym - jak widzisz - nie ma potrzeby sprawdzania za pomocą SELECT, czy użytkownik w tabeli time_online istnieje, wystarczy bowiem spróbować dokonać aktualizacji rekordu, a jeśli aktualizacja się nie powiedzie (mysql_affected_rows() zwróci 0) to będzie to oznaczać, że użytkownika o nazwie $name_p nie ma w tabeli time_online i trzeba go dodać.
Odsyłam do manuala: mysql_num_rows(), mysql_affected_rows().

Cytat
Skrypt wyszukuje wszystkich użytkowników na stronie i zlicza ich czas bycia online. Jeżeli użytkownik jest nowy, to dodaje go do czasu "obserwowanych", stąd ten INSERT.

Nie zmienia to faktu, że lepiej do wyszukiwania użytkownika nadawałaby się kolumna UID aniżeli name, oraz że obie te kolumny powinny być unikalne i śmiało można nałożyć na nie indeksy, co przyspieszy nieco działanie skryptu.

Ten post edytował mortus 4.09.2011, 09:24:59
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: 8.10.2025 - 15:39