我在php中創建一個論壇(爲了好玩),我也希望顯示每個論壇的帖子和主題的數量。在數據庫的論壇中添加一列顯示線程/主題的數量,以及每當有人創建/刪除將更新的主題或每次論壇頁面加載時計算主題/線程的數量,是否更好?這種情況下常見的做法是什麼?有什麼更好的使用:跟蹤數據庫中的數量或計數
回答
計數記錄是唯一可靠的方法來做到這一點;如果你存儲計數,那麼你將有一個併發問題來解決;給數據庫一個機會,只有修復它,如果它成爲一個真正的問題。我的經驗是,COUNT(*)可以快得驚人。
我有一張有1.2M記錄的表(它有正確的索引);剛剛嘗試select count(*) from table_name where field=11;
需要0.02秒並返回104,計數500k記錄需要0.15秒。這是在一個相當低規格的VPS上使用mysql。
關鍵是要做一些性能測試,只在存在真正的性能問題時才從最簡單最可靠的解決方案進行優化。
爲了增加可信度,我剛剛在一個使用'WHERE IndexedColumn = x'的記錄超過200M的表上進行了計數,並且花費了不到一秒的時間(SQL Server 2008)。 – GarethD
我不認爲這兩個步驟是可選的。
If you dont update the count whenever someone creates/deletes a thread,
which count will you display on your forum?
每當有任何更新,即創建/刪除,你必須遞增/遞減計數器。 然後在顯示時可以始終顯示計數。
'SELECT COUNT(*)FROM topics WHERE forum_id =:forum_id' – ilias
數據庫規範化規則表示,數據庫中不應該有任何值,您可以根據數據庫中的其他值以編程方式構造這些值。所以如果你只是關於「正確的工程」,那麼每次需要展示時都要計算主題。
在正常情況下,保持計數器值不會提高性能。應該可以編寫查詢,以便在需要顯示時重新計算這些值的性能影響可以忽略不計(如果可以的話)。如其他帖子所示,即使在指定條件下,COUNT
也可能非常快。請記住在必要時使用索引。
最後,你必須做出決定。根據所需的使用情況,將數據庫標準化可能會妨礙足夠的性能以確保付出代價,使應用程序性能稍差,並在某處添加計數器。但是,使數據庫非規範化應該始終是最後的手段。
欣賞評論。另外,好點。我會嘗試重新說明並明確指出,它應該能夠以性能問題幾乎消失的方式構建查詢。去標準化應該是最後的手段。 – ilias
我會建議更新計數,因爲新帖子被添加或刪除。這個更新應該是準確的,所以它需要做一些鎖定。鎖定會在父記錄上創建一些爭用(線索更新論壇,帖子更新線程等)。確保您已定義索引,以便此更新速度更快。
當用戶瀏覽論壇時,根本不要鎖定記錄。我不會在意髒讀,因爲100%準確並不像在會計軟件中那麼重要。論壇是一個有生命的實體,所以如果它在頁面加載之間看起來稍微不同,那麼它是可以的。
另外,您可能需要偶爾運行一些查詢來驗證計數是否正確。
- 1. 在數據庫中跟蹤數量
- 2. 使用數據庫跟蹤
- 3. 會員數據庫有什麼更好?
- 4. 如何跟蹤數據庫表中的數據更改
- 5. Oracle數據庫審計跟蹤
- 6. Django:使用值跟蹤所有數據庫更改
- 7. 跟蹤使用訪問數據庫
- 8. MySQL數據庫更改跟蹤
- 9. 跟蹤數據庫列值更改
- 10. SQLAlchemy如何跟蹤數據庫更改?
- 11. 如何跟蹤數據庫更改?
- 12. 跟蹤heroku數據庫更改
- 13. 跟蹤MySQL數據庫更改
- 14. 數據庫查詢 - 更好地計數行數或更好保持增量計數器?
- 15. 使用關係數據庫跟蹤實驗數據的演變
- 16. 構建數據庫以跟蹤對數據的某些更改
- 17. 跟蹤數據庫動作
- 18. 數據庫對象跟蹤
- 19. 標誌數據庫 - 跟蹤
- 20. 使用LINQ到SQL跟蹤數據庫的外部更改
- 21. 使用WCF跟蹤數據
- 22. 流量例如在weblogic的跟蹤/審計跟蹤數據EM不可用
- 23. 跟蹤計數在訓練中使用
- 24. 在大量數據庫中啓動MySQL數據庫id有什麼好處嗎?
- 25. 數據庫 - 哪個更好,爲什麼?
- 26. Excel中的數據跟蹤
- 27. 數據錄入跟蹤(數據庫設計)
- 28. 「跟蹤」(調試)Firebird 2.5數據庫中發生了什麼
- 29. 是否有可能跟蹤庫存和更新數據庫中的項目數量用Paypal進行購買?
- 30. 跟蹤數據庫更改的所有表
定義「更好」。但在大多數情況下,存儲預先計算的金額將更容易使用並且速度更快。 – Crozin
你預期有多少帖子/主題? 1個主題的帖子=每次計算一次。數以百萬計的話題中有數十億的帖子?在某處緩存計數。中間某個地方?基準並找出切入點的位置。 –
對不起,我的意思是更好,因爲在更常見的。我geussing大多數預製論壇(例如phpNuke)都使用相同的方法計算線程/帖子。 – inControl