需要一些帮助来优化这个mySQL查询

时间:2013-03-08 04:20:38

标签: mysql performance

我有这个查询运行以从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;

2 个答案:

答案 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_idt.forum_idt.topic_id,{{1} },p.topic_idp.poster_idu.user_id

(&lt;&gt;和!=等效)

答案 1 :(得分:0)

您可能需要在表格中添加一些索引。

请阅读this article,了解EXPLAIN命令。这将使您能够查看查询的瓶颈位置,然后您将看到需要创建哪些索引。

例如,如果在两个表之间创建JOIN,则必须确保两个字段都有索引。否则MySQL将不得不做一些额外的工作来管理跨表。另外,我建议你(如果你还没有)为你用来命令行(ORDER BY p.post_id)的字段创建索引..这也有助于查询的性能,否则MySQL将不得不创建临时表来排序结果,这也很耗时。

希望这有助于你