簡體   English   中英

優化SQL查詢

[英]Optimize SQL-query

我有以下查詢:

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

我認為這是一個糟糕的策略。 還有其他建議嗎?

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

我似乎被低估了,因為你實際上可以從日記表中檢索所需的所有數據。 我假設這是一個簡化的例子,實際上需要日記表中的其他字段,這個方法也會帶回沒有注釋的記錄。 如果你不需要這兩件事中的任何一件,那么我會選擇其他答案。

看起來您在評論表中擁有了所需的所有數據,因此我沒有看到連接或子查詢的原因。

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

對於tomhaigh的解決方案來說肯定是加一個,在這種情況下,一個小組就是這樣。

另一個選擇總是值得記住,你在這里有兩個選擇。 首先計算每次讀取的值,然后在每次寫入時計算它並存儲結果。 在第二種情況下,您需要在日記上添加一個名為“comments_count”的附加字段,這需要在插入新評論時遞增。 顯然,這可能不如在每次讀取時計算計數並且會減慢寫入速度。 但是如果讀取性能受損並且寫入明顯不如讀取那么常見,那么這可以是考慮問題的便捷方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM