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