优化SQL查询

时间:2009-02-21 11:33:10

标签: php sql mysql

我有以下查询:

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 个答案:

答案 0 :(得分: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 :(得分:1)

看起来你在评论表中拥有了所需的所有数据,所以我没有看到连接或子查询的原因。

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

答案 2 :(得分:1)

对于tomhaigh的解决方案肯定加一,解决方案就是这种情况下的组合。

另外一个选择总是值得记住,你在这里有两个选择。首先计算每次读取的值,然后在每次写入时计算它并存储结果。在第二种情况下,您需要在日记上添加一个名为“comments_count”的附加字段,这需要在插入新评论时递增。显然,这可能不如在每次读取时计算计数并且会减慢写入速度。但是如果读取性能受损并且写入明显不如读取那么常见,那么这可以是考虑问题的一种方便方法。