2011-07-31 66 views
0

從一個比我自己有更多經驗的人那裏,簡單地計算一個表中的項目數量(比如計算一個類別中的主題數量)還是保持一個包含該值的變量並且僅僅增加並稱它(類別表中的額外字段)?計數項目或遞增數字?

兩者之間是否存在顯着差異還是隻是非常輕微,即使它很輕微,一種方法是否還會比另一種更好?這不是針對任何一個特定的項目,所以請一般回答(如果有意義的話),而不是基於用戶數量等。

謝謝。

+0

也許您應該明確自己的意圖和想法。是否像「爲什麼我們總是在SQL中使用COUNT(*)?」一樣簡單?例如 – gbn

回答

4

要獲得項目(表中的行)的數量,你會使用標準的SQL,並做到按需

SELECT COUNT(*) FROM MyTable 

注意,如果我錯過了什麼,每個項目(行)在表中有一些唯一的標識符,無論是零件號,某些代碼還是自動增量。因此,添加一個新行可以觸發列的「自動遞增」。

這與「計數行」無關。由於DELETEs或ROLLBACK,數字可能不是連續的。

試圖單獨保持行數將會以淚水和/或災難而告終。嘗試使用COUNT(*)+1或MAX(id)+1生成新的行標識符更糟糕

+0

由於您仍然必須執行數據庫查詢才能獲取該值,因此不妨一次獲取該值。然後,計數行可能是最簡單的查詢之一,它必然是快速的(而不是獲得一個正確的值)。 – Christian

+1

@Christian Sciberras:關於不使用COUNT的權衡是單獨維護計數的併發問題... – gbn

+0

儘量避免通配符*,特別是當函數正在評估它時。如果數據集是GIANT,那麼將拉入所有數據的速度會明顯較慢,這與數據設計中常見的唯一(且最重要的)標識符相反。 – Blake

0

在我的論壇上,我算子線程在這樣的論壇:

SELECT COUNT(forumid) AS count FROM forumtable 

只要你使用的標識符,指定哪些論壇和/或子部分相同,該列有一個索引鍵,它非常快。所以沒有理由添加比您需要的更多的列。

+0

我認爲他想要統計表中的元素..auto_increment對此並不好。 – duedl0r

+0

是的,我在比較一個表格中的項目數量,以便將該數字存儲爲一個字段,例如將該論壇類別表格中作爲字段創建的主題數量計算爲一個字段,而不是每次查看時重新計數統計數據。 – Ruffy

+0

哦,在我看來,他似乎在試圖計算表中的行數,以便提供一個id來添加一個。然後讓我調整我的答案。 – Blake

1

我認爲您的問題存在一些混淆。我的解釋是你想要做一個select count(*)還是一個你追蹤實際數量的專欄。

如果您沒有理由這樣做,我不會添加這樣的列。這是過早的優化,並且會使您的軟件設計複雜化。

此外,你想避免在不同的地方存儲相同的信息。計數是一項微不足道的任務,所以你實際上覆制了信息,這是一個壞主意。

0

我會去計數。如果您發現性能問題,您可以考慮其他選項,但只要您保留一個單獨的值,就必須做一些工作來確保它始終正確。可以這麼說,使用COUNT()你總能得到實際的數字「直接從馬的嘴裏」。

基本上,不要開始優化,直到你必須。如果一切正常,使用COUNT(),那麼就這樣做。否則,將計數存儲在某個地方,而不是通過加/減來更新存儲值,在需要時運行COUNT()以獲取新項目數