哪個是最佳做法?場景:如果我有兩個表格,一個叫topics
,另一個叫posts
,每個帖子屬於一個特定的topic_id
。我應該使用列來計算行數還是使用PHP計數?
最好在topics
表中有一列名爲post_count
,我會根據該topic_id
創建/刪除任何文章時更新該列。
或者最好使用SELECT COUNT查詢來計算topic_id
匹配的行數?
是否存在任何缺點或效率差異?
哪個是最佳做法?場景:如果我有兩個表格,一個叫topics
,另一個叫posts
,每個帖子屬於一個特定的topic_id
。我應該使用列來計算行數還是使用PHP計數?
最好在topics
表中有一列名爲post_count
,我會根據該topic_id
創建/刪除任何文章時更新該列。
或者最好使用SELECT COUNT查詢來計算topic_id
匹配的行數?
是否存在任何缺點或效率差異?
在列上存儲post_count
是denormalisation。
查閱單個字段的讀取性能比執行SELECT COUNT
更快,但大多數人會同意這是一個不成熟的優化,它會引入更新異常的可能性。數據庫應該存儲規範化(即非冗餘)數據,除非您有基準指示這是您的應用程序中的性能瓶頸。
通過查看數據庫和應用程序之間的緩存層,您可能會更好地服務,以便每次查詢數據庫時都不會執行計數,但會在posts
的內容更改時更新 - 您甚至可能發現MySQL是already caching the result。
如果我有定期檢查'post_count的準確性的功能,這也是實用的嗎? '列通過比較它'SELECT COUNT'? (某些東西可能每週都會安排,也可以由管理員手動完成) – Sakuya 2015-02-12 01:25:41
它確實取決於應用程序生命週期的階段,以及您的心態/方法。我會說,如果你有一個工作,部署的應用程序有數千到數百萬個主題和帖子,並且你已經發現了這個緩存無法緩解的特定查詢的明顯性能問題,那就去做吧。否則,我會說忘記它 - 不要浪費你的時間,當你可以在實際功能上工作時,引入可能的錯誤。 – 2015-02-12 01:41:39
爲了好玩,我在我的筆記本電腦上的postgresql數據庫(即非科學)上跑了一段時間,首先有200條記錄,然後有200條記錄。查看結果:http://pastebin.com/C6xRy6K3。對於較少數量的帖子,SELECT COUNT實際上更快。 – 2015-02-12 02:13:48
我更喜歡總是更新主題表。因此,如果1個主題有10000 ++帖子,並且用戶只想知道帖子有多少帖子,那麼查詢可以更快 – 2015-02-12 01:13:31