Det är ett litet forum som jag har gjort själv, med tabeller för trådar, poster och besök samt en för medlemmar men den är inte viktig för exemplet.
TRÅDAR har fälten
trådnr (primärnyckel)
rumsnr (index)
medlemsnr
rubrik
datum
status
Liten tabell, under 50 rader.
(rumsnumret är för att det finns olika avdelningar i forumet, men inte så många så att jag har brytt mig om att göra en tabell av det)
POSTER har fälten
postid (primärnyckel)
rumsnr
trådnr (index tillsammans med datum)
medlemsnr
datum (index tillsammans med trådnr)
text
Ett tusental rader.
BESÖK sparar
trådnr (unik nyckel tillsammans med medlemsnr)
medlemsnr (unik nyckel tillsammans med trådnr)
datum (index)
Ett par hundra rader kanske, det blir inte mer än medlemsantalet*trådantalet men allt är ju i extremt liten skala.
En fråga som tar lång tid är den här, som körs när man är i ett rum. Den tar fram alla trådar som hör till rummet och sorterar på status och datum, dessutom tar den fram senaste gången medlemmen var i tråden och datum för senaste post så att det går att visa om det finns olästa inlägg.
SELECT t.rubrik, t.status, t.trådnr, b.datum AS senaste, p.datum
FROM (trådar AS t LEFT JOIN besök AS b
ON t.trådnr = b.trådnr AND b.medlemsnr = $id)
JOIN poster AS p ON p.trådnr=t.trådnr
WHERE t.rumsnr=$rumsnr
AND p.datum IN
(SELECT MAX( p.datum )
FROM poster AS p JOIN trådar AS t
ON p.trådnr = t.trådnr
WHERE t.rumsnr = $rumsnr
GROUP BY p.trådnr)
ORDER BY t.status, p.datum DESC
Det finns ett annat segt ställe men den är nästan lika så löser jag ovanstående bör den andra också vara biff. Problemet verkar vara den nästlade SELECT-satsen som ska hitta maxdatumet för alla trådar. Men jag inser ju att jag JOINar väldigt mycket också. Och att webbhotellet inte är det snabbaste.
En annan sak som förbryllar mig är att när jag kollar tidsåtgången för frågan så är den 2-3 sekunder, men kollar jag den direkt igen är den nere på under en sekund. Men phpMyAdmin kanske kommer ihåg resultatet bara?