2013-01-22 56 views
-1

我在php中創建一個論壇(爲了好玩),我也希望顯示每個論壇的帖子和主題的數量。在數據庫的論壇中添加一列顯示線程/主題的數量,以及每當有人創建/刪除將更新的主題或每次論壇頁面加載時計算主題/線程的數量,是否更好?這種情況下常見的做法是什麼?有什麼更好的使用:跟蹤數據庫中的數量或計數

+2

定義「更好」。但在大多數情況下,存儲預先計算的金額將更容易使用並且速度更快。 – Crozin

+0

你預期有多少帖子/主題? 1個主題的帖子=每次計算一次。數以百萬計的話題中有數十億的帖子?在某處緩存計數。中間某個地方?基準並找出切入點的位置。 –

+0

對不起,我的意思是更好,因爲在更常見的。我geussing大多數預製論壇(例如phpNuke)都使用相同的方法計算線程/帖子。 – inControl

回答

3

計數記錄是唯一可靠的方法來做到這一點;如果你存儲計數,那麼你將有一個併發問題來解決;給數據庫一個機會,只有修復它,如果它成爲一個真正的問題。我的經驗是,COUNT(*)可以快得驚人。

我有一張有1.2M記錄的表(它有正確的索引);剛剛嘗試select count(*) from table_name where field=11;需要0.02秒並返回104,計數500k記錄需要0.15秒。這是在一個相當低規格的VPS上使用mysql。

關鍵是要做一些性能測試,只在存在真正的性能問題時才從最簡單最可靠的解決方案進行優化。

+0

爲了增加可信度,我剛剛在一個使用'WHERE IndexedColumn = x'的記錄超過200M的表上進行了計數,並且花費了不到一秒的時間(SQL Server 2008)。 – GarethD

0

我不認爲這兩個步驟是可選的。

If you dont update the count whenever someone creates/deletes a thread, 
which count will you display on your forum? 

每當有任何更新,即創建/刪除,你必須遞增/遞減計數器。 然後在顯示時可以始終顯示計數。

+0

'SELECT COUNT(*)FROM topics WHERE forum_id =:forum_id' – ilias

1

數據庫規範化規則表示,數據庫中不應該有任何值,您可以根據數據庫中的其他值以編程方式構造這些值。所以如果你只是關於「正確的工程」,那麼每次需要展示時都要計算主題。

在正常情況下,保持計數器值不會提高性能。應該可以編寫查詢,以便在需要顯示時重新計算這些值的性能影響可以忽略不計(如果可以的話)。如其他帖子所示,即使在指定條件下,COUNT也可能非常快。請記住在必要時使用索引。

最後,你必須做出決定。根據所需的使用情況,將數據庫標準化可能會妨礙足夠的性能以確保付出代價,使應用程序性能稍差,並在某處添加計數器。但是,使數據庫非規範化應該始終是最後的手段。

+0

欣賞評論。另外,好點。我會嘗試重新說明並明確指出,它應該能夠以性能問題幾乎消失的方式構建查詢。去標準化應該是最後的手段。 – ilias

0

我會建議更新計數,因爲新帖子被添加或刪除。這個更新應該是準確的,所以它需要做一些鎖定。鎖定會在父記錄上創建一些爭用(線索更新論壇,帖子更新線程等)。確保您已定義索引,以便此更新速度更快。

當用戶瀏覽論壇時,根本不要鎖定記錄。我不會在意髒讀,因爲100%準確並不像在會計軟件中那麼重要。論壇是一個有生命的實體,所以如果它在頁面加載之間看起來稍微不同,那麼它是可以的。

另外,您可能需要偶爾運行一些查詢來驗證計數是否正確。