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
Radek_1
post
Post #2





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

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


mortus, doskonale rozumiem co napisałeś wcześniej. Powtórzę jeszcze raz, sprawdzanie czy nastąpiła aktualizacja rekordu przy pomocy mysql_affected_rows() jest _wolniejsze_ niż sprawdzenie czy rekord istnieje i późniejsza ewentualna aktualizacja/wstawienie.
Tj. szybciej jest:
1. Sprawdzić czy użytkownik istnieje
2. Zaktualizować jeżeli istnieje
3. Wstawić nowy rekord jeżeli nie istnieje

Niż:
1. Zaktualizować rekord
2. Sprawdzić mysql_affected_rows() czy nastąpiła aktualizacja (w przypadku gdy użytkownik nie istnieje to go nie zaktualizuje, no bo jak?)
3. Wstawić nowy rekord jeżeli nie nastąpiła aktualizacja.


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

W jaki sposób wyszukiwać po UID? Skoro strona na której sprawdzam czy ktoś jest online jest niezależna ode mnie i napisane są na niej tylko i wyłącznie nazwy? A co do name to nadałem index i jest unikalna (IMG:style_emoticons/default/smile.gif)

Ten post edytował Radek_1 4.09.2011, 18:30:15
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 - 19:35