2011-08-30 54 views
2

我似乎無法找到關於此的很多信息。SQL COUNT(col)vs extra logging column ...效率?

我有一個表記錄用戶的意見。我有另一張桌子來記錄每個評論的其他用戶的喜好/不喜歡。 因此,當選擇要顯示在網頁上的這些數據時,需要一個複雜的查詢來請求連接和子查詢來計算所有喜歡/不喜歡的事物。 我的例子是查詢別人好心幫我在這裏,以實現所要求的結果:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
    (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes, 
    (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes, 
    comment_likers.liker 
FROM comments 
INNER JOIN usrs ON (comments.usr_id = usrs.usr_id) 
LEFT JOIN comment_likers ON (comments.comment_id = comment_likers.comment_id 
    AND comment_likers.usr_id = $usrID) 
WHERE comments.topic_id=$tpcID 
ORDER BY comments.created DESC; 

不過,如果我添加了一個好惡的意見表列並創建了一個觸發自動遞增/遞減這些列作爲喜歡插入/刪除/更新到LIKER表,那麼SELECT語句將比現在更簡單和更有效。我在問,使用COUNTS進行這種複雜查詢還是需要額外的列和觸發器會更高效?

而一概而論,它是更有效的進行計數或到有定期被查詢時,計數一個額外的列?

+0

可能重複[爲什麼人們在新數據庫的列中保存X的數量?](http://stackoverflow.com/questions/6883352/why-do-people-saves-count-of-x-in-new-databases-column) –

+1

請參閱建議的副本。非常類似的問題 - 存儲聚合而不是在每個頁面視圖上重新計算它們會更有效。 –

+0

是的,謝謝你的鏈接,我已經能夠閱讀關於此事的第一個真實信息。 – Psyrus

回答

0

您的查詢效率很低。您可以輕鬆地消除這些子查詢,這將顯着提高性能:

你的兩個子查詢,可以通過簡單的更換:

sum(liker) likes, 
sum(abs(liker - 1)) dislikes, 

使整個查詢這樣的:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
    sum(liker) likes, 
    sum(abs(liker - 1)) dislikes, 
    comment_likers.liker 
FROM comments 
INNER JOIN usrs ON comments.usr_id = usrs.usr_id 
LEFT JOIN comment_likers ON comments.comment_id = comment_likers.comment_id 
    AND comment_likers.usr_id = $usrID 
WHERE comments.topic_id=$tpcID 
ORDER BY comments.created DESC; 
+0

謝謝你的建議。我並不熱衷於所有的子查詢,但是沒有其他辦法可以在一個查詢中檢索所有需要的數據。不幸的是,你的建議不起作用,但你可能沒有意識到我的要求。我其實從這裏得到了這個查詢的幫助,這裏的鏈接會告訴你我的需求:http://stackoverflow.com/questions/7225303/mysql-count-function-not-performing-asi-i-would-like -in-多個接查詢 – Psyrus