WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Acceptabelt resurskrävande? (https://www.wn.se/forum/showthread.php?t=38548)

mephisto73 2009-08-17 23:57

Vad anser du är "acceptabelt" eller "normalt" för en MySQL-driven sida i antal queries per sidvisning? Är 80 queries onormalt mycket?

jonny 2009-08-18 00:44

Det beror ju på sida, men det låter som det skulle kunna optimeras rent spontant.

emilv 2009-08-18 06:15

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?

mephisto73 2009-08-18 08:36

Frågorna tar c:a 0.5-1 sekunder att utföra, normalt sett.

Westman 2009-08-18 08:38

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.

danjel 2009-08-18 09:59

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"..

mephisto73 2009-08-18 10:43

ok tack för hjälpen

tartareandesire 2009-08-18 10:52

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.

mephisto73 2009-08-18 13:03

Var hittar man tips på hur man optimerar mysql-frågor? Vad "kostar" och vad är "billigt"?

BjörnJ 2009-08-18 13:17

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%"
Kör alltid med "LIMIT 1" om du inte förväntar dig fler rader.

tartareandesire 2009-08-18 15:18

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.

taz76 2009-08-18 20:58

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.

objx 2009-08-18 21:36

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.

tartareandesire 2009-08-19 07:33

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.

danjel 2009-08-19 11:11

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 ...");


Jonas 2009-08-19 14:23

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.

WizKid 2009-08-19 14:25

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