2009-02-21 122 views
4

我有以下查询:优化SQL查询

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']); 
} 

我认为这是一个糟糕的策略。任何其他建议?

回答

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 

我似乎已经被低估了,因为您实际上可以从日记表中检索所需的所有数据。我认为这是一个简单的例子,实际上日记表中的其他领域将是必需的,同样这种方法带回没有评论的记录。如果你不需要这两件事情,那么我会与其他答案一起去。

1

它看起来像你在评论表中有你需要的所有数据,所以我没有看到加入或子查询的原因。

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

好点。尽管他可能想要显示没有评论的日记项目。 – 2009-02-21 14:51:55

1

绝对加上一个tomhaigh的解决方案,一组由正是在这种情况下的东西。

另一个选项总是值得记住,你有两个选择在这里。首先计算每次读取的值,然后在每次写入时计算并存储结果。在第二种情况下,您需要在名为'comments_count'的日记上添加一个字段,这需要在插入新评论时增加。很明显,这可能比在每次读取时计算出来的准确度要低,并且会减慢写入速度。但是,如果读取性能受到影响并且写入明显不如读取那么常见,那么这可以是考虑问题的方便方式。