我有一个有效的查询,但运行至少需要 3 秒,所以我认为它可能会更快。它用于填充新线程列表并显示每个线程中有多少未读帖子。我在将查询字符串放入$db->query_read()
. 为了只从有效论坛中获取结果,$ids
字符串最多包含 50 个值,以逗号分隔。
该userthreadviews
表已存在 1 周,其中大约有 9,500 行。我不确定我是否需要设置一个 cron 作业来定期清除一周以上的线程视图,或者我是否可以让它增长。
这是目前的查询:
SELECT
`thread`.`title` AS 'r_title',
`thread`.`threadid` AS 'r_threadid',
`thread`.`forumid` AS 'r_forumid',
`thread`.`lastposter` AS 'r_lastposter',
`thread`.`lastposterid` AS 'r_lastposterid',
`forum`.`title` AS 'f_title',
`thread`.`replycount` AS 'r_replycount',
`thread`.`lastpost` AS 'r_lastpost',
`userthreadviews`.`replycount` AS 'u_replycount',
`userthreadviews`.`id` AS 'u_id',
`thread`.`postusername` AS 'r_postusername',
`thread`.`postuserid` AS 'r_postuserid'
FROM
`thread`
INNER JOIN
`forum`
ON (`thread`.`forumid` = `forum`.`forumid`)
LEFT JOIN
(`userthreadviews`)
ON (`thread`.`threadid` = `userthreadviews`.`threadid`
AND `userthreadviews`.`userid`=$userid)
WHERE
`thread`.`forumid` IN($ids)
AND `thread`.`visible`=1
AND `thread`.`lastpost`> time() - 604800
ORDER BY `thread`.`lastpost` DESC LIMIT 0, 30
连接post
表的替代查询(仅显示用户发布的线程)实际上是两倍快,所以我认为这里必须有一些东西可以改变以加快速度。有人可以提供一些建议吗?
编辑:抱歉,我已将 EXPLAIN 放在备用查询前面。这是正确的输出:根据要求,这是 EXPLAIN SELECT 生成的输出: