2009-02-21 117 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'的日記上添加一個字段,這需要在插入新評論時增加。很明顯,這可能比在每次讀取時計算出來的準確度要低,並且會減慢寫入速度。但是,如果讀取性能受到影響並且寫入明顯不如讀取那麼常見,那麼這可以是考慮問題的方便方式。