Permalänk

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; }

Permalänk
Medlem

Du får nog gå ifrån din egen DB-class, och köra SQL-frågor direkt mot databasen istället, där du i frågan specificerar de kriterier som ska uppfyllas. Då får alltså skapa SQL-frågor för varje typ av budget som du behöver (tre stycken?). Nyckelord som du ska titta närmare på är SUM() och GROUP BY.

Permalänk
Medlem

Annars kan du alltid köra explain på select satsen och kolla om det är ngt knas där, med saknade index osv

Permalänk

Kanske lära dig JOIN? Indexering är BRA skit att ha på ALLA tabeller förutom hjälptabeller.

Permalänk

Ok,

först så upprepar jag att sidan fungerade perfekt när det kördes lokalt och tabellerna ÄR indexerade. Problemet uppstår när man byter till remote databas.

Jag har läst om JOIN fast det var några år sedan och vet inte hur jag ska applicera det på koden som den är. Det är rostig kunskap. Problemet ligger i att man anropar databasen hundratals gånger med korta queries på en sida.

Vore trevligt om man kunde slippa attityden.

Permalänk
Testpilot

När du säger att du flyttade databasen online, menar du att sidan och databasen ligger på olika servrar?

Nu vet jag inte hur det ligger till men du kanske har valt en billig databashost som på nått sätt begränsar antalet frågor man kan göra i sekunden eller så är uppkopplingen mellan webbservern och databasservern dålig? i något av dessa fallen kanske JOIN verkligen är en bra idé att kolla på så du får ut alla poster i enbart en fråga.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Du kanske kan få lite klarhet i det här problemet i den här tråden på wn.se:
Misslyckade databasanslutningar, Hur ofta sker de

Där går de igenom lite teori bakom sega sqlanslutningar och hur man kan lösa det.

Annars så kanske du ska byta webbhotell till någon som tillhandahåller sqlservern lokalt.

Visa signatur

Jag är konstig. Är du?
----
http://posera.nu/

Permalänk
Medlem

får du något som helst svar från databasservern? Vissa hostar har blockerat remote-access till databasservrarna...

Visa signatur

weeeee

Permalänk
Medlem

Använd SQL direkt för att få ut det du vill ha, så mycket det går, istället för att behandla om rå-data.

Utöver det är det nog som alla andra har sagt.

Permalänk

Jag kodade om hela skiten. Tog en lång intensiv dag, men nu funkar det.

Istället för att hämta ut data veckovis (med hundratals mysql-anrop), så hämtar jag ut data årsvis i ett stort paket och sen lattjar jag runt med en array. Nu laddar sidan på nån millisekund.