Avatar billede hathor Nybegynder
19. februar 2011 - 09:48 Der er 1 løsning

Hjemmelavet forum - min SQL-kode er noget langsomt skrammel. Er der nogen der vil give et råd til optimering?

Lige en lille forklaring så I ikke skælder mig for meget ud:

For det første leder jeg ikke efter nogen til at skrive lange funktioner til mig, mens hvis nogle kunne forklare hvor jeg med fordel kan læse i forskellige manualer, ville jeg blive glad.

Jeg kan kun en minimal mængde PHP og MySQL, og på grund af uheldige omstændigheder, er jeg kommet til at skulle vedligeholde en side der i forvejen var bygget.

Siden er totalt hjemmebygget fra bunden af, selv hvad angår sidens forum. 

Der mangler enormt meget caching af SQL-resultater og der er utallige gentagne funktioner, men da sitet er hostet på en meget stor server, så kører den alligevel hurtigt nok.
-----------------------

Problemet jeg slås med er følgende: Jeg vil gerne vise et ikon på sitets forum, hvis en bruger har besøgt en tråd, og der ikke er postet nye indlæg siden besøget.

Jeg har derfor oprettet en tabel som jeg har kaldt forum_visit, hvortil jeg skriver brugerens ID, trådens ID og det sidste indlægs ID, når en bruger besøger en tråd. Jeg har dog husket ikke at lave en ny entry hver gang en bruger besøger en tråd - jeg opretter en ny entry for hvert første besøg i en tråd, herefter opdaterer jeg denne entry, så hver bruger har kun én entry pr. tråd.

Der bliver vist 99 indlæg pr side i dette forum, og de bliver hentet fra databasen i tabellen 'forum' og vist således - det er forøvrigt ikke mig, der har programmeret denne del - (jeg fjerner felternes navne, ellers bliver det meget langt, og det er jo mere funktionen der benyttes der er interessant):

$po = $db->get_results("SELECT <trådnummer og diverse andre felter> ORDER BY $sortby DESC LIMIT <værdi>, <værdi>");
if($po){
foreach ( $po as $output ){ sæt div. variabler og udskriv emnerne i forummet; }




Det fungerer hurtigt nok, ingen ko på isen.

Så er det så, jeg gerne vil lave mit tjek for, om en bruger har besøgt en given tråd, og i så fald tjekke om tråden har nye indlæg siden besøget, og så er det, at det går betydeligt langsommere.

Jeg gør det således - først den almindelige hent emner, og så to database queries for hver udskrift, så sæt en variabel alt efter om tråden har været besøgt eller ej:

$po = $db->get_results("SELECT <trådnummer og diverse andre felter> ORDER BY $sortby DESC LIMIT <værdi>, <værdi>");
if($po){
foreach ( $po as $output )
{


$threadmaxpost = $db->get_var("SELECT <nyeste indlæg> FROM Forum WHERE thread = '$output->trådnummer'");

$logpidmax = $db->get_var("SELECT <højeste loggede indlæg> as pidmax FROM forum_visit WHERE thread = '$output->trådnummer' AND bruger = '$bruger'");

stil div. variabler, og udskriv emnerne i forummet; }



indklamringen af de to databasekald i -->>* *<<-- er blot for at vise, hvor de kald der udgør problemet er, når jeg nu ikke kan skrive med fed skrift.


Hvis jeg remmer de to kald ud, kører forummet meget hurtigt igen - men jeg vil så gerne beholde denne funktion.

Jeg kender ikke nok til MySQL/PHP til at lure hvordan jeg ligesom kan undgå at udføre 200 queries pr. forum side.


Tabellen der indeholder én entry pr. bruger pr. tråd oprettede jeg den 8/2 og den indeholder lige nu, den 19/2, 183.979 entries.



Hathor
Avatar billede hathor Nybegynder
08. marts 2011 - 02:34 #1
Lukker
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
Computerworld tilbyder specialiserede kurser i database-management

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