Avatar billede nicocarlos Nybegynder
09. december 2004 - 03:01 Der er 20 kommentarer og
1 løsning

Hvad er bedst for serveren

Hejsa.
Hvilket af dette er bedst for serveren og bruger mindre ram etc.

1:
$yourstats="SELECT * from v_users where BINARY username like '$player'";
$yourstats2=mysql_query($yourstats) or die("Could not get your stats");
$yourstats3=mysql_fetch_array($yourstats2);

eller

2:
function dothisquery ($sql){
    $myquery = mysql_query($sql) or die (mysql_error());
    return $myquery;
    mysql_free_result($myquery);
}
$yourstats2=dothisquery("SELECT * from v_users where BINARY username like '$player'") or die('Could not get your stats');
$yourstats3=mysql_fetch_array($yourstats2);


Jeg har hørt at 2'eren skulle være bedst men hvorfor?
Avatar billede 2c Nybegynder
09. december 2004 - 08:01 #1
2'eren er bedst fordi du sparer en linie kode hver gang du kalder funktionen.
2'eren er også bedre fordi den er mere strukturerert.

I 2'eren kalder du dog aldrig mysql_free_result($myquery);, da du har retuneret fra funktionen inden. Der er vel heller ingne grund til at du kalder or die 2 gange i 2'eren.

Jeg tror ikke der den store forskel for hvad der er bedst for serveren. Jo mindre din fil fylder, jo mindre skal serveren holde i hukommelsen. Derfor er 2'eren nok bedst hvis du laver mange sql kald, da du sparer en linie hver gang, og på den måde får mindre kode. Men jeg tror næpe det er noget der har den store betydning.
Avatar billede nicocarlos Nybegynder
09. december 2004 - 08:27 #2
Jeg troede at det havde meget at sige at lave mysql_free_result($myquery); , jeg sprøger fordi at flere hosts siger at jeg har for tung kode, og jeg fik en til at kigge på min kode og det var det eneste "store" han kunne finde.
Avatar billede nicocarlos Nybegynder
09. december 2004 - 08:30 #3
Jeg vil meget gerne lave det der er hurtigst for serveren, især med mine guery's da jeg har rigtig mange af dem.
Avatar billede 2c Nybegynder
09. december 2004 - 08:31 #4
I ingen af de to koder kalder du mysql_free_result($myquery);

I din 2'er returnerer du før du kommer derned, så den bliver aldrig kaldt.
Avatar billede 2c Nybegynder
09. december 2004 - 08:35 #5
En funktion som mysql_free_result($myquery), kan du eventuelt kalde når du ikke skal buge indholdet af det du har hentet mere. Altså f. eks når du har skrevet indholdet af $myquerynår du på skærmen.
Avatar billede knas Nybegynder
09. december 2004 - 10:53 #6
Har du tjekket dine SQL forespørgsler?

Din forespørgsel ovenfor, ville vinde noget i tid, ved at lave den således:
"SELECT * from v_users where BINARY username = '$player'"

Sagen er, at du ikke bruger LIKE til noget. Hvis du vil finde alle navne der indeholder noget af $player, skal forespørgslen se sådanne ud: "SELECT * from v_users where BINARY username like '%$player%'". Nu tillades der, at der både står noget før og efter $player strengen.
Avatar billede jakoba Nybegynder
09. december 2004 - 10:56 #7
2'eren virker ikke som du vist tror. funktionen er færdig idet den udfører return sætningen og 3die linie bliver aldrig udført.

og det er forresten en god ting. hvis det virkelig lykkedes dig at frigive resultatets memory der ville den returnerede værdi ikke kunne bruges til noget. variabelen ville pege på ingenting eller et tomt array.

Det kode du har der er IKKE det tunge. med en WHERE betingelse som
    username like '$player'
vil der typisk kun blive returneret en enkelt række fra tabellen. småting.

Prøv evt at fortælle lidt om hvad du ellers laver på dit websted, så kan vi nok pege på noget andet som 'det tunge'. 

mvh JakobA
Avatar billede olebole Juniormester
09. december 2004 - 15:00 #8
<ole>

En tung ting, vi muligvis allerede har fået vist er din '*'. Du bør kun bruge '*', hvis du virkelig _skal_ have det hele med fra tabellen. Skal du ikke bruge alle felter, skal du _kun_ angive de felter, du skal bruge:
  "SELECT `id`, `navn`, `alder` FROM ... osv, osv ..."
Det er noget, mange overser - og det er noget, der slider på SQL-serveren. Den overdrevne brug af '*', har jeg på fornemmelsen, stammer fra MySQL-referencen (og dermed et hav af tutorials). Den er god/nem at bruge i eksempler - men er sjældent god i den virkelige verden  :)

Når du selecter og du ved, du kun skal hente én række, så brug 'LIMIT 1'. Det samme gælder, hvis du skal opdatere én bruger med 'UPDATE'. Gør du ikke det, fiser MySQL hele tabellen færdig og leder efter flere, når du har hentet/opdateret den ene række.

Måske er det sidste 'småting', som Jakob skriver - men med al respekt, har jeg set større portaler med et utal af denne slags 'sjuskede' kald, som har fået forbedret deres performance væsentligt med en gang optimmering.

Så er der jo indekseringen, som man også bør bruge en del tid på at checke

/mvh
</bole>
Avatar billede nicocarlos Nybegynder
09. december 2004 - 18:25 #9
OKay andre ting som måske kunne være tunge:
Denne kører jeg så alle mine brugere bliver opdateret, køres hvert 20'ende minut og tror den kræver meget ved ikke om den kan laves lettere:

$updateturns="update v_users set turns=turns+2 where turns<450";
mysql_query($updateturns) or die("Could not update your stats");
Avatar billede olebole Juniormester
09. december 2004 - 18:50 #10
Ikke hvis turns er indekseret og dine brugere skal opdateres hvert 20. minut  :)
Avatar billede nicocarlos Nybegynder
09. december 2004 - 18:59 #11
okay så er der lige en ting til nemlig min index.
Ligenu bliver hele siden opdateret hver gang man trykker på en knap som vises som en iframe. Det kan vel godt tage en masse resourcer at loade alt hver gang. Ville det være bedst med iframe eller hvordan?
Avatar billede jakoba Nybegynder
09. december 2004 - 19:18 #12
Den der UPDATE er nok rimelig dyr, og er vel egentlig ret overflædig.
Istedet for at have en værdi 'turns' der opdateres for alle brugere, kunne du istedet gemme brugernes 'starttid' og så efter behov udregne turns som
  $turn = ( 'tid nu' -'starttid' ) / '10 minutter'
på den måde behøver du slet ikke opdatere nogetsomhelst.
Avatar billede olebole Juniormester
09. december 2004 - 19:27 #13
Dooohhh ... ja, selvfølgelig er det da tidsintervaller, der bliver opdateret!  :oP
Så skal du naturligvis gøre, som Jakob skriver - sorry  :)
Avatar billede nicocarlos Nybegynder
09. december 2004 - 19:48 #14
problemet er at den skal også opdatere når brugeren er online...så er der vel noget ekstra jeg skal lave som f.eks.
Logud tid for at kunne finde ud af hovr ture der skal gives ikke også?
Avatar billede nicocarlos Nybegynder
09. december 2004 - 19:53 #15
For mit vedkommende ville det vel være at køre fælgende når brugeren logger ind:
$turn=('tid nu'-sidste login) / '10 minutter' .
Avatar billede nicocarlos Nybegynder
09. december 2004 - 19:57 #16
Og med hensyn til min 2. til at starte med:

2:
function dothisquery ($sql){
    $myquery = mysql_query($sql) or die (mysql_error());
    return $myquery;
    mysql_free_result($myquery);
}

Hvordan ville i æave den så den virker bedst muligt, kræver mindst
Avatar billede jakoba Nybegynder
09. december 2004 - 20:06 #17
function dothisquery ($sql){
    return mysql_query($sql) or die (mysql_error());
}

eller evt helt lade være med at have en funktion til det.
Avatar billede nicocarlos Nybegynder
09. december 2004 - 20:10 #18
altså den funktion hjælper altså ikke meget eller? - hvordan ville du lave det uden funktionen?
Avatar billede jakoba Nybegynder
09. december 2004 - 20:26 #19
Den hjælper forsåvidt som at du så ikke behøver at huske at tilføje 'or die(...)' hver gang. det er godt.
den skader forsåvidt som at du nu ikke længere får helt så god en fejlmelding. Når noget går galt vil det altid være i den linie så du må selv hitte ud af hvilket af de mange steder du kalder funktionen der er noget galt. det er ikke så godt.

Jeg ville beholde funktionen, men udvide det info der udskrives når noget går galt:
function dothisquery ($sql){
    return mysql_query($sql)
          or die ("Query fejl i: " .$sql ."<br>" .mysql_error() );
}
nu får du udskrevet både MySQL's fejlmelding, og hele den sql kommando der gik galt.

mht performance er forskellen på at bruge funktion eller ikke så lille at det er flintrendes ligyldigt.

mvh JakobA
Avatar billede nicocarlos Nybegynder
10. december 2004 - 11:32 #20
okay takker, lig svar :)
Avatar billede nicocarlos Nybegynder
12. september 2005 - 00:34 #21
Lukker over ½ år gammel
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester