优化SQL查询

4

我有以下查询:

Select diary_id, 
   (select count(*) 
    from `comments` as c 
    where c.d_id = d.diary_id) as diary_comments 
From `diaries` as d

执行时间很长(在我的情况下接近0.119415秒)。如何使它变得更快?

我只看到一种方法:为主查询中的每一行执行附加的评论数量查询。但这将类似于循环中执行查询。大概像这样:

while ($r = mysql_fetch_array($res))
{
   $comments = mysql_query("select count(*) from `comments` where d_id = ".$r['diary_id']);
}

我认为这是一个不好的策略。还有其他建议吗?
3个回答

9
SELECT d.diary_id, count(c.d_id) as diary_comments 
FROM diaries d
LEFT OUTER JOIN comments c ON (d.diary_id = c.d_id)
GROUP BY d.diary_id

我似乎已经被downvote了,因为你实际上可以从日记表中检索到所有所需的数据。我假设这是一个简化的例子,实际上需要从日记表中获取其他字段,而且这种方法会返回没有评论的记录。如果您不需要这两个内容,则应该选择其他答案。


1

看起来你在评论表中已经拥有了所有需要的数据,所以我不认为需要进行连接或子查询。

SELECT d_id AS diary_id, COUNT(*) AS diary_comments
FROM `comments`
GROUP BY d_id

好的观点。虽然他可能想显示没有评论的日记项目。 - Tom Haigh

1

绝对支持 tomhaigh 的解决方案,使用分组是在这种情况下的恰当方式。

另一种选项值得记住,你有两种选择。第一种是在每次读取时计算值,第二种是在每次写入时计算并存储结果。在第二种情况下,你需要在日记中添加一个名为“comments_count”的附加字段,这需要在插入新评论时进行累加。显然,这可能比在每次读取时计算数量不那么准确,并且会减慢写操作的速度。但如果读取性能较差,而写操作明显比读操作少,则这可以考虑的一种方便的方法来解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接