0

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

2 回答 2

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_idp.topic_idp.poster_id和。u.user_idt.topic_status

(<> 和 != 是等价的)

于 2013-03-08T04:58:53.137 回答
0

您可能必须向表中添加一些索引。

请阅读本文,您可以在其中了解该EXPLAIN命令。这将使您能够看到查询的瓶颈在哪里,然后您将看到需要创建哪些索引。

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

希望这可以帮助你

于 2013-03-08T04:51:28.660 回答