Avatar billede phpbegynder2004 Nybegynder
27. marts 2007 - 17:27 Der er 9 kommentarer og
1 løsning

Optimering af "Ændringer siden sidst"-script

Hej,

Jeg har et brugersystem, hvor der er billeder, mulighed for at kommenterer billederne og et forum.

For at brugerne kan følge med, har jeg lavet et script, der undersøger hvor mange billedekommentarer og svar i forummet, der er skrevet siden personen sidst var online.

Det gøres således:
Hver bruger har en række i tabellen "aendringer", hvori det højeste id (fx. 52) fra tabellen med billedekommentarer bliver indsat (højeste=nyeste).
Næste gang personen logger ind, bliver der tjekket i tabellen "billedekommentar" hvor mange der er højere end tallet i ændringer (52). Det antal rækker, som har et id over 52, er antallet af ændringer.

---- aendringer ----
brugerid | forumsvarid | billedekommentarerid
  1    |    99  |  52 

Det samme gentager sig med forumsvar

Det er dog ret langsomt, og jeg tænkte om der ikke fandtes noget hurtigere? Der er desuden mange flere ting den tjekker ændringer på. Billedekommentarer, er bare et eksempel, men fremgangsmåden er den samme!

Bare skriv hvis I ikke forstår!

Her er koden:

//Hent ændringer
$hent_aendringer = mysql_query("SELECT * FROM aendringer WHERE id='$_SESSION[id]'");
$raekke_aendringer = mysql_fetch_assoc($hent_aendringer);

//Forumsvar
$hent_forumsvar = mysql_query("SELECT autoid FROM forum_svar WHERE autoid>'$raekke_aendringer[forumsvar]'")or die(mysql_error());
$antal_forumsvar = mysql_num_rows($hent_forumsvar);
if($antal_forumsvar!=0){
  $forumsvar=" (".$antal_forumsvar." svar)";
}

//Billeder kommentarer
$hent_billede_kom = mysql_query("SELECT id FROM billede_kommentare WHERE id>'$raekke_aendringer[billeder_komm]'")or die(mysql_error());
$antal_billede_kom = mysql_num_rows($hent_billede_kom);
if($antal_billede_kom!=0){
  $billede_kom=" (".$antal_billede_kom." svar)";
}
Avatar billede intenz Novice
27. marts 2007 - 17:46 #1
Du har sat index på felterne "forum_svar" og "billede_kommentare"? Ellers vil det forbedre hastigheden væsentligt ved en sådan kald.

Du kan også ændre:
$hent_forumsvar = mysql_query("SELECT autoid FROM forum_svar WHERE autoid>'$raekke_aendringer[forumsvar]'")or die(mysql_error());
$antal_forumsvar = mysql_num_rows($hent_forumsvar);
if($antal_forumsvar!=0){
  $forumsvar=" (".$antal_forumsvar." svar)";
}


til:
$hent_forumsvar = mysql_query("SELECT count(autoid) as antal FROM forum_svar WHERE autoid>'$raekke_aendringer[forumsvar]'")or die(mysql_error());
$antal_forumsvar = mysql_fetch_rows($hent_forumsvar);
if($antal_forumsvar["0"]!=0){
  $forumsvar=" (".$antal_forumsvar[0]." svar)";
}

Og samme fremgangsmåde i den anden. Så henter den ikke al data ud, men tæller bare hvor mange der er.

Men index (hvis du ikke har det) vil give den største hastighedsforøgelse.
Avatar billede phpbegynder2004 Nybegynder
27. marts 2007 - 17:50 #2
Okay, tak!
Men "billede_kommentare" og "forum_svar" er tabeller og ikke felter.
Hvordan er det jeg skal sætte dem til index?
Avatar billede intenz Novice
27. marts 2007 - 17:53 #3
Hehe, copy/pastede forkert. Jeg mente selvfølgelig "autoid" i de to tabeller :)

Hvor mange poster skal en søge igennem? Jeg kunne forestille mig autoid er en autoincrement felt. Så den burde have index, og et sådan kald burde ikke være så tungt.
Avatar billede intenz Novice
27. marts 2007 - 17:54 #4
Hvad med "id" i tabellen "aendringer". Har den index?
Avatar billede intenz Novice
27. marts 2007 - 17:59 #5
Jeg så lige du skrev "Der er desuden mange flere ting den tjekker ændringer på". Hvor mange tabeller er "mange"?
Avatar billede phpbegynder2004 Nybegynder
27. marts 2007 - 18:22 #6
Det tænkte jeg nok, men ville bare lige være sikker :)

Der er 14 felter i "aendringer" (forumsvarid, billedekommentarerid mv)
Hvert felt bliver tjekket op mod en tabel (på nær feltet id).
Der er altså 13 tabeller (og det synes jeg er mange ;) ).

Feltet "id" i tabellen "aendringer" er brugerens id. Det har ikke index.

Jeg har sat index på "id" i tabellen "forum_svar"
Nu får jeg følgende besked inde i phpMyAdmin:
"Warning PRIMARY og INDEX nøgler burde ikke begge være sat for kolonne `id`"

Bør jeg fjerne en af dem? Og hvilken bør det være?
Avatar billede phpbegynder2004 Nybegynder
27. marts 2007 - 18:27 #7
Btw. Ja, autoid er autoincrement

I billede_kommentare er der 10336 rækker og i forum_svar er der 6352 rækker
Avatar billede intenz Novice
29. marts 2007 - 17:41 #8
Du skal fjerne INDEX, PRIMARY er også et index. Så det betyder ikke noget.
Avatar billede phpbegynder2004 Nybegynder
17. september 2007 - 02:49 #9
Fik desværre aldrig løst problemet, men hvis du vl have nogle point kan du lægge et svar...
Avatar billede phpbegynder2004 Nybegynder
25. september 2007 - 21:24 #10
Lukket
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