[PHP] performance verbeteren while loops
Ik ben bezig met een intranet waarop o.a. kmstanden berekend moeten worden. Nu heb ik 1 grote pagina waarin een arrays - van db queries - d.m.v. while loops doorlopen worden. Zie onderstaande voorbeeld.
Het probleem is nu dat de pagina enorm slecht performed. Ik heb al wat laadtijden per onderdeel verzameld en er zitten 2 stukken in die erg lang duren, resp. 7 en 22 seconden. Onderstaande stuk code duurt tussen de 6-7 om uit te voeren.
Ik heb een aantal indexen aangebracht, maar dat maakte niet veel verschil (maakt voor onderstaande code helemaal niets uit, omdat ik op basis van id's de tabel induik). Ik las ook ergens dat het nogal kan schelen als for i.p.v. while gebruikt, alleen met for ben ik niet zo bekend.
Maakt dit echt veel verschil en is het bijvoorbeeld mogelijk om m.b.v. een for loop een array )op basis van een selectie) te doorlopen?
Ik hoop dat jullie me wat tips kunnen geven over hoe ik onderstaande - en soortgelijke -code sneller kan maken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$query_ritten = "SELECT rit_id, aantal_km
FROM ritten
WHERE auto_id = '$auto_id'
AND aantal_km is not null
ORDER BY datum, ritnr ASC";
$result = mysql_query($query_ritten);
while($kmstanden = mysql_fetch_array($result)){
$eindstand = $beginstand + $kmstanden[aantal_km]; // de 1e keer is beginstand de in 1e instantie opgehaalde beginstand
$query_update_kmstand = "UPDATE ritten
SET beginstand = '$beginstand',
eindstand = '$eindstand'
WHERE rit_id = '$kmstanden[0]'
AND auto_id = '$auto_id'";
$result3 = mysql_query($query_update_kmstand);
$beginstand = $eindstand; // de eindstand wordt de beginstand voor de volgende rit
}
?>
mysql_fetch_assoc ipv mysql_fetch_array is iets sneller ook al zal je het verschil niet werken. Verder misschien PDO met prepared statements gebruiken, dit schijnt sneller te zijn
het laden van het script duurt zo lang omdat je waarschijnlijk veel query's uitvoerd (de update query in de while).
Donhertog schreef op 28.06.2007 12:37:
het laden van het script duurt zo lang omdat je waarschijnlijk veel query's uitvoerd (de update query in de while).
Ok.
Maar afgaande op bovenstaand voorbeeld; wat zou je er anders kunnen dan? Ik zal in dit geval toch op basis van de rit die nieuwe begin en eindstand moeten inserten, omdat deze waarden per rit berekend en bijgewerkt moeten worden.
Gewijzigd op 01/01/1970 01:00:00 door Sneeuwvlok
misschien ook even kijken of je database model wel optimaal is