![]() |
Vad anser du är "acceptabelt" eller "normalt" för en MySQL-driven sida i antal queries per sidvisning? Är 80 queries onormalt mycket?
|
Det beror ju på sida, men det låter som det skulle kunna optimeras rent spontant.
|
Vilken typ av frågor? Hur snabbt går det? Finns det någon fråga som låser någon tabell? Är det någon skrivning?
|
Frågorna tar c:a 0.5-1 sekunder att utföra, normalt sett.
|
80 queries låter mycket men det kan vara 80 små och optimerade queries som knappt märks så det är inte alldeles enkelt att svara på om det är ok eller inte.
|
antalet frågor är inte så farligt..
men tiden 0.5 - 1 sekunder indikerar att vissa frågor inte är optimerade.. kör "explain select".. |
ok tack för hjälpen
|
Tycker också det låter lite väl mycket men det är ju omöjligt att svara på vad som kan göras. Optimering skadar ju aldrig.
|
Var hittar man tips på hur man optimerar mysql-frågor? Vad "kostar" och vad är "billigt"?
|
Se till att ha index på de kolumner som används för att söka upp rader.
Vid flera villkor i WHERE, lägg det villkoret som är "billigast" först, så behöver de "dyrare" villkoren inte utvärderas lika ofta. Till exempel: Kod:
... WHERE uid=123 AND ngntextkol LIKE "%ngtord%" |
Använder du färdiga programvaror med plugins så är det dessutom ganska ofta som data hämtas flera gånger helt i onödan.
|
lagra alla sql-frågor som lagrade procedurer :) vet inte hur stor skillnad det blir i mysql men i mssql säger dom iaf det ger en prestandaökning.. värt att testa om prestanda är ett problem kanske.
|
Jag brukar använda PHP för att testa hur lång tid vissa queries tar att utföra samt hur lång tid det tar att läsa ut resultatet.
Skapa två funktioner i din kod som ser ut på följande sätt: <?php $timers = array(); function startTimer($ref="timer"){ global $timers; $timers[$ref] = microtime(true); } function endTimer($ref="timer",$decimals=3){ global $timers; if(!isset($timers[$ref])){ return 0; } $secs = (float) microtime(true) - $timers[$ref]; return round($secs,$decimals); } ?> Sen kan du ta reda på tidsåtgången för varje query/resultset genom att använda funktionerna på följande sätt: <?php startTimer("query1"); $query1 = mysql_query("SELECT * FROM .... WHERE ..."); print "query1 tog ".endTimer("query1")." sekunder att genomföra"; startTimer("query2"); $query2 = mysql_query("SELECT * FROM .... WHERE ..."); while($row = mysql_fetch_array($query2)){ ...... } print "query2 tog ".endTimer("query2")." sekunder att genomföra"; ?> Denna metod brukar ofta hjälpa mig att hitta ooptimerade queries. Du kan ju givetvis ställa samma frågor direkt i MySQL-prompten och få reda på hur lång tid varje förfrågan tar. Men då blir det lite jobbigare om man vill testa tidsåtgången beroende på vilka villkor som ställs i varje query. Jag tycker inte att 80 frågor låter mycket om du har 20-30 tabeller som datan hämtas från och som skall presenteras på samma sida. Däremot så skulle du ju kunna kolla upp om en fråga ställs fler än en gång på samma sida. I såna fall så är det väl smartare att cacha resultatet i en array som du sedan kan återanvända. |
Finns det data som inte ändras särskilt ofta men som ofta hämtas kan det också vara en bra idé att skapa statiska versioner.
|
kolla upp MySQL EXPLAIN kommandot...
då ser man hur index m.m används.. Kod:
|
Notera att när du använder ORDER BY i en MySQL fråga så använder MySQL inte sitt Index. Sådana frågor kommer alltså att ta tid.
|
MySQL kan visst använda index vid order by.
|
Alla tider är GMT +2. Klockan är nu 16:00. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson