1 (edited by chrizz 2006-01-30 07:11)

Topic: Förslag till optimering av en SQL-fråga

Jag har lagt märke till en query som är lite av en flaskhals i punbb. Det gäller när man listar "senast aktiva trådarna". Närmare queryn (eller motsvarande, jag har inte kollat så jättenoga nu. fattas ju lite värden här för att det ska vara just den queryn. Men i vilket fall...):

SELECT t.id, t.subject, t.last_post FROM forum.topics AS t INNER JOIN forum.forums AS f ON f.id=t.forum_id LEFT JOIN forum.forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL AND t.closed=0 ORDER BY t.last_post DESC LIMIT 25;

Explain på den ger i mitt fall runt 7200 rows för tabellen topic.

Det känns onödigt och kan minskas ned rejält.

Mitt hastiga förslag är index på columnen last_post i tabellen topics, och sen ändra queryn till:

SELECT t.id, t.subject, t.last_post FROM forum.topics AS t INNER JOIN forum.forums AS f ON f.id=t.forum_id LEFT JOIN forum.forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE t.last_post > unix_timestamp()-<tiden för när användaren "sist var inloggad"> AND (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL AND t.closed=0 ORDER BY t.last_post DESC LIMIT 25;

Skillnaden ligger i ett tillägg direkt efter WHERE.

Detta minskar antalet aktuella rader i tabellen topics dramatiskt.

Mvh Christian

Re: Förslag till optimering av en SQL-fråga

Man tackar. Jag skriver upp det på listan smile

"Programming is like sex: one mistake and you have to support it for the rest of your life."

3 (edited by chrizz 2006-03-22 06:55)

Re: Förslag till optimering av en SQL-fråga

Kollade lite mer på det här nyss och hittade att "problemet" låg i extern.php, och inte search.php.

Det blir visserligen inget problem förrän man gör som jag, nämnligen att visa aktiva trådar på varje sida och varje sidvisning, och när trafiken blir intensiv kan den här queryn ta kål på servern och få loaden att gå upp i taket.

I vilket fall, en enkel lösning för mig var att lägga till:

WHERE ... AND t.last_post>".(time()-60*60*24)." ...

Om forumet är relativt aktivt kanske 24 timmar bak räcker för att alltid fylla listan över aktiva trådar, annars kan man ju alltid öka till en vecka eller så.

MVH.