FAQ |
Kalender |
2009-08-18, 15:18 | #11 | ||
|
|||
Supermoderator
|
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.
__________________
Full-stack developer, free for smaller assignments |
||
Svara med citat |
2009-08-18, 20:58 | #12 | ||
|
|||
Flitig postare
|
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.
|
||
Svara med citat |
2009-08-18, 21:36 | #13 | ||
|
|||
Medlem
|
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. |
||
Svara med citat |
2009-08-19, 07:33 | #14 | ||
|
|||
Supermoderator
|
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.
__________________
Full-stack developer, free for smaller assignments |
||
Svara med citat |
2009-08-19, 11:11 | #15 | ||
|
|||
Medlem
|
kolla upp MySQL EXPLAIN kommandot...
då ser man hur index m.m används.. Kod:
function sql_debug($sql){ $r = mysql_query("EXPLAIN " . $sql); $nc = mysql_num_fields($r); $str= '<table border=1><tr>'; for ( $i=0; $i < $nc; $i++ ){ $str .= '<td><i>'. mysql_field_name($r,$i) . '</i></td>'; } $str .= '</tr>'; while ($row = mysql_fetch_row($r)){ $str .= '<tr>'; for ( $i=0; $i < $nc; $i++ ) { $str .= '<td>' . $row[$i] . '</td>'; } $str .= '</tr>'; } return $str .'</table>'; } print sql_debug("SELECT * FROM ..."); |
||
Svara med citat |
2009-08-19, 14:23 | #16 | ||
|
|||
Klarade millennium-buggen
|
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.
|
||
Svara med citat |
2009-08-19, 14:25 | #17 | ||
|
|||
Mycket flitig postare
|
MySQL kan visst använda index vid order by.
|
||
Svara med citat |
Svara |
|
|