27. marts 2007 - 17:27Der 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.
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)"; }
Kommunerne har digitaliseret indgangen for borgerne. Men bag skærmen håndteres mange arbejdsgange stadig manuelt mellem systemer, mails og organisatoriske siloer.
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.
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.
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?
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.