2015-02-12 88 views
1

哪個是最佳做法?場景:如果我有兩個表格,一個叫topics,另一個叫posts,每個帖子屬於一個特定的topic_id我應該使用列來計算行數還是使用PHP計數?

最好在topics表中有一列名爲post_count,我會根據該topic_id創建/刪除任何文章時更新該列。

或者最好使用SELECT COUNT查詢來計算topic_id匹配的行數?

是否存在任何缺點或效率差異?

+3

我更喜歡總是更新主題表。因此,如果1個主題有10000 ++帖子,並且用戶只想知道帖子有多少帖子,那麼查詢可以更快 – 2015-02-12 01:13:31

回答

3

在列上存儲post_countdenormalisation

查閱單個字段的讀取性能比執行SELECT COUNT更快,但大多數人會同意這是一個不成熟的優化,它會引入更新異常的可能性。數據庫應該存儲規範化(即非冗餘)數據,除非您有基準指示這是您的應用程序中的性能瓶頸。

通過查看數據庫和應用程序之間的緩存層,您可能會更好地服務,以便每次查詢數據庫時都不會執行計數,但會在posts的內容更改時更新 - 您甚至可能發現MySQL是already caching the result

+0

如果我有定期檢查'post_count的準確性的功能,這也是實用的嗎? '列通過比較它'SELECT COUNT'? (某些東西可能每週都會安排,也可以由管理員手動完成) – Sakuya 2015-02-12 01:25:41

+1

它確實取決於應用程序生命週期的階段,以及您的心態/方法。我會說,如果你有一個工作,部署的應用程序有數千到數百萬個主題和帖子,並且你已經發現了這個緩存無法緩解的特定查詢的明顯性能問題,那就去做吧。否則,我會說忘記它 - 不要浪費你的時間,當你可以在實際功能上工作時,引入可能的錯誤。 – 2015-02-12 01:41:39

+1

爲了好玩,我在我的筆記本電腦上的postgresql數據庫(即非科學)上跑了一段時間,首先有200條記錄,然後有200條記錄。查看結果:http://pastebin.com/C6xRy6K3。對於較少數量的帖子,SELECT COUNT實際上更快。 – 2015-02-12 02:13:48

相關問題