MySQL prestandaproblem
Jag arbetade på en PHP/MySQL sida lokalt som funkade snabbt och bra, men problem uppstod när jag flyttade databasen online. Sidan blev skitseg och fick timeout.
Efter ha snackat lite med en kollega så frågade han om jag kör queries i loopar. Det har jag (ibland 2-3 loopar i varandra) och han sa att det kan tex vara nån millisekund mellan varje query kan köras och lägger man ihop allt så blir det en jäkla lång tid!
Tex så har jag en funktion budget() som kör en query som hämtar ut budget för en person, en viss vecka och år.
Sen har jag en funktion companyBudget() som hämtar alla anställda för företaget och kör budget() på varje anställd.
Det finns även accumulatedBudget() som kör en loop med alla årets veckor och anropar budget(). accumulatedCompanyBudget() anropar i så fall först accumulatedBudget() på varje anställd som i sin tur anropar budget() för varje vecka.
Ja ni förstår hur det ser ut.
Jag förstår att jag kanske måste strukturera om koden grundligt pga detta. Någon som har något förslag?
exempelkod:
/*
* Returns weekly budget for sales person
*/
function budget($week, $year, $spID){
$companyID = intval($_GET['id']);
$db = new db();
$db->set("budget", "amount");
$row = $db->select("week='$week' AND year='$year' AND company_id='$companyID' AND sales_person_id='$spID'", 1, "");
return $row['amount'];
}
/*
* Returns weekly budget for the company (sum of all sales person budgets)
*/
function companyBudget($week, $year){
$staff = getStaff();
$budget = 0;
foreach($staff as $id => $name) {
$budget = $budget + budget($week, $year, $id);
}
return $budget;
}
/*
* Returns accumulated budget stats for sales person from 1st week -> given week
*/
function accBudget($week, $year, $spID){
$accBudget = 0;
$weekCounter = 1;
while($weekCounter <= $week){
$accBudget = $accBudget + budget($weekCounter, $year, $spID);
$weekCounter++;
}
return $accBudget;
}
/*
* Returns accumulated budget stats for sales person from 1st week -> given week
*/
function accCompanyBudget($week, $year){
$staff = getStaff();
$budget = 0;
foreach($staff as $id => $name) {
$budget = $budget + accBudget($week, $year, $id);
}
return $budget;
}