2013-03-08 47 views
0

我有这个查询,运行从phpbb3获得5个最近的帖子/主题。论坛有超过18万条记录。这个当前查询平均需要20秒才能完成..任何想法我可能会优化它以使其更快?需要一些帮助优化这个mySQL查询

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

使用加入到优化所述 – DevT 2013-03-08 04:22:42

+0

什么倾斜,你应该使用'JOIN's,而不是把所有的连接条件在'WHERE'条款。 – 2013-03-08 04:23:44

+0

也可以使用EXPLAIN来查看添加索引可能有用的位置。 – Daedalus 2013-03-08 04:33:35

回答

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_idu.user_idt.topic_status

(<>和!=是等价的)

+0

出于好奇,说逗号分隔的连接速度较慢? – 2013-03-08 05:03:48

+0

谢谢aidan!它现在运行在0.070s :) – nk510 2013-03-08 05:07:24

+0

@ b.b3rn4rd,哦,它不会变慢。这两种风格实际上将以完全相同的方式执行。我发现当连接明确时更容易处理。 – aidan 2013-03-08 05:46:59

0

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

请仔细阅读this article,其中您可以了解有关EXPLAIN命令的信息。这将使您能够查看查询的瓶颈位置,然后您将看到需要创建哪些索引。

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

希望这有助于你