Avatar billede kdjweb Nybegynder
09. november 2007 - 17:10 Der er 5 kommentarer og
1 løsning

Meget meget lang while

Hej Eksperter.

Jeg prøver at forudse noget af min kode, men er ikke altid så nemt, derfor fo jeg lige brug for jeres ekspertise :)

Først noget kode.
$q = mysql_query("SELECT * FROM tabelnavn");
while($r = mysql_fetch_array($q)){
    // Masse variabler og en eller to UPDATE query(s)
}

Hvis nu den her kode kører igennem 50.000 gange vær time via. et cronjob ville der blive sendt 50.000 -> 100.000 query's vær time. Det lyder af ret meget?

Mit spørgsmål til jer er: Er der en måde at gøre det her på?

Mvh. Kasper
Avatar billede showsource Seniormester
10. november 2007 - 08:14 #1
noget mere kode ville nok være godt.

M.h.t. UPDATE , kan du måske:

hvis du har et felt som er unikt, ( typisk "id" primary autoincrement ) kan du nøjes med at hente id, og smide dem i et array, og så bruge
WHERE id IN (". implode(",", $id_array) .")
for at køre en update query, i stedet for en query for hvert id

Men ellers, hent kun de felter du ved er nødvendig, i stedet for blot at bruge *
Avatar billede kdjweb Nybegynder
10. november 2007 - 08:56 #2
tjae, noget mere kode vil vel gøre godt, havde måske bare tænkt om folk havde stødt ind i problemmet før.

Der er ingen fejl i koden. søger bare en praktisk måde at gøre det på hvis den while lykke bliver kørt igennem 50.000 gange vær time.

$q = mysql_query("SELECT * FROM kasinos");

while($r = mysql_fetch_array($q)){
    $hour_inc = 0;
   
    // random m2 = ((m/100)*(50->100)/2)
    $hour_used = floor((($r['size']/100)*(rand(50,100)))/2);
   
    for($i = 0; $i <= $hour_used; $i++){
        $hour_inc += rand(100,1000);
    }

    $new_income = $hour_used.",".$hour_inc;

    $money_q = mysql_query("SELECT money FROM brugere WHERE ID = '".$r['ejer']."'");
    $money_r = mysql_fetch_array($money_q);
    $new_money = $money_r['money']+$hour_inc;
    mysql_query("UPDATE kasinos SET income = '".$new_income."' WHERE ID = '".$r['ID']."'");

    mysql_query("UPDATE brugere SET money = '".$new_money."' WHERE ID = '".$r['ejer']."'");
}
Avatar billede showsource Seniormester
10. november 2007 - 10:21 #3
Ligner du kunne bruge noget "sammenkøring" ( husker ikke lige udtrykket ) for at få din query mere simpel/enkel/udføre færre query's

Men for optimal query, så prøv i Mysql kategorien
( arne_v plejer at være sej i den retning )
Avatar billede bavingo Nybegynder
10. november 2007 - 10:58 #4
Hvis det er muligt kunne du jo inddele det med limit, også laver sider i dit script. altså

SELECT * FROM `kasinos` LIMIT $page,100

Hvor page angiver hvor langt man er nået, 0, 100, 200 etc.
Avatar billede kdjweb Nybegynder
10. november 2007 - 15:38 #5
bavingo, kan ikke se hvor du vil hen med det. Det er jo præcis det samme som jeg gør, du folænger bare pocessen så den vil tage endnu længere tid at udføre. Husk nu, den der while skal køres igennem 50.000 gange i timen, tvivler på den når at blive færdig til næste time hvis jeg gør sådan. :P

Showsource, mangler jo bare noget at kunne sammenkøre med så. ;)

Vil prøve at læse lidt mere i MySQL 5.0 manualen, håber arne_v kigger forbi. :P
Avatar billede kdjweb Nybegynder
11. november 2007 - 17:55 #6
Nåeh, jeg må vel hellere lukke og oprette en ny under MySQL så.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Netcompany A/S

IT Consultant

Everllence

Software Engineer

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations

Udlændinge- og Integrationsministeriet

Contract manager til it-området i Udlændingestyrelsen