2011-07-12 82 views
3

如果我正在製作消息應用程序(例如電子郵件),並且我不得不計數消息的數量。MySQL計數性能

我會變得更好,每次計數的消息,或者我應該創建一個名爲numOfMsg新列並在收到消息時增加它。

編輯:

好像phpBB的http://wiki.phpbb.com/Table.phpbb_topics店的答覆號在數據庫中,沒有人知道他們的意圖是?

+0

這取決於您是計算消息表的所有行還是其中的一部分,例如,基於輔助鍵的一個郵箱的消息?此外,您的消息表的大小很重要。如果你有適當的指數,我不會擔心大小在10萬行以下的表格。 – Martijn

回答

1

你可以使用MySQL的函數COUNT()計數的消息。如果你使用適當的指數,這非常快。 (如果你通過用戶+盒子計數,你將希望在用戶+盒子上有一個組合索引)

請注意,MySQL也會緩存你的查詢結果,所以只要沒有新消息到達[你的消息表不變],它甚至不會回到內存/磁盤來做實際計數;它只會返回最後一個值。所以非常便宜的操作。

與保持額外的冗餘信息是,它可能很難保持這些最新的麻煩;您可以添加或刪除郵件;一些用戶可能會在兩個盒子之間移動消息,並且所有這些都必須保持計數器正確。您還必須開始使用事務來確保消息的INSERT和計數器的更新既可以完成,也可以兩者都沒有完成(例如,當您失去連接或者某些事件崩潰時)。

1

這是一個很好的問題,答案可能取決於你的應用規模。保持運行的計數結果肯定會讓您在需要時更容易或更快地檢索這些數字,但它也會使您的代碼變得更加複雜,因爲每次插入,刪除或移動消息時都必須保持跟蹤郵箱/文件夾(如果這是您的應用程序允許的)。

如果你願意去努力保持計數了最新的,它可能對那種事情的好辦法。

我當然在代碼中使用那種狀態計數器。

0

這不是一個好主意,有一個numOfMsg場海事組織,你一定要跟蹤數在程序中,。無論如何,MySQL optimizes COUNT(*),我懷疑這將是你的應用程序的瓶頸。

+1

MySQL僅在沒有WHERE(即對於整個表)的情況下優化COUNT(*),並且只對MyISAM表進行優化。 – Mchl

+0

是的,僅適用於MyISAM,但即使使用WHERE,也會設置適當的索引。 – Jacob

1

當然,高速緩存消息數量更快。但是,如果您擁有正確的索引,並且假設一個用戶沒有一百萬條消息,則計數速度足夠快。它當然也取決於存儲引擎(例如,基於列的存儲引擎在集成功能方面速度更快) 但是,假設您每次選擇用戶數據,將消息計入同一行,每次都會節省一次查詢。

我的建議是 - 除非它對性能有影響,否則要繼續計數。由於計數導致性能下降時,緩存計數。甚至當緩存不夠時,您可以考慮對數據庫進行非規範化。過早優化沒有用,答案真的取決於應用程序的規模,以及新消息的發生頻率。