我有这个查询运行以从phpbb3获取5个最近的帖子/主题。论坛有超过180,000条记录。这个当前查询平均需要20秒才能完成..有任何想法我如何优化它以使其更快?
SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id, p.post_id, p.poster_id, p.post_time, u.user_id, u.username
FROM phpbb_topics t, phpbb_forums f, phpbb_posts p, phpbb_users u
WHERE t.topic_id = p.topic_id AND
f.forum_id = t.forum_id AND
t.forum_id != 4 AND
t.topic_status <> 2 AND
p.post_id = t.topic_last_post_id AND
p.poster_id = u.user_id
ORDER BY p.post_id DESC LIMIT 5;
答案 0 :(得分:1)
首先,我认为t.topic_id = p.topic_id
子句是多余的,因为p.post_id = t.topic_last_post_id
已经暗示了它。所以试试这个简化版本:
SELECT
t.topic_id,
t.topic_title,
t.topic_last_post_id,
t.forum_id,
p.post_id,
p.poster_id,
p.post_time,
u.user_id,
u.username
FROM phpbb_forums f
JOIN phpbb_topics t ON f.forum_id = t.forum_id
JOIN phpbb_posts p ON t.topic_id = p.topic_id
JOIN phpbb_users u ON p.poster_id = u.user_id
WHERE
t.forum_id != 4 AND
t.topic_status != 2
ORDER BY p.post_id DESC LIMIT 5;
其次,(这可能是导致缓慢的原因)确保您在以下列中有索引:f.forum_id
,t.forum_id
,t.topic_id
,{{1} },p.topic_id
,p.poster_id
和u.user_id
。
(&lt;&gt;和!=等效)
答案 1 :(得分:0)
您可能需要在表格中添加一些索引。
请阅读this article,了解EXPLAIN
命令。这将使您能够查看查询的瓶颈位置,然后您将看到需要创建哪些索引。
例如,如果在两个表之间创建JOIN
,则必须确保两个字段都有索引。否则MySQL将不得不做一些额外的工作来管理跨表。另外,我建议你(如果你还没有)为你用来命令行(ORDER BY p.post_id
)的字段创建索引..这也有助于查询的性能,否则MySQL将不得不创建临时表来排序结果,这也很耗时。
希望这有助于你