2013-03-30 71 views
3

我正在計劃一張桌子的結構和編程,這個桌子將有大約10億行。COUNT在MySQL中有多快?

很多時候我想做一個SELECT COUNT(*) ON mytable WHERE somecol="5"somecol將有一個索引,並且是一個INT

選項1是我只有我的一個巨大的表,並使用SELECT COUNT(*)如上所述。

方案2是我或者可以有一個額外的表,稱爲mytableofcounts中,我只有兩列:somecolnum和我保持總次數的紀錄somecol。此表格只有大約幾十萬行,並且somecol將是唯一的。那麼我可以改爲SELECT num FROM mytableofcounts WHERE somecol="5"

我更喜歡選項1,因爲它在存儲和編程方面既簡單又有效,但我擔心的是它可能會很慢。通過使用選項2的額外表格來節省處理速度,還是與選項1一樣快?

+2

相關http://stackoverflow.com/questions/10976328/mysql-count-performance-on-very-big-tables –

+0

您應該測試選項1,看它是否足夠快。如果沒有,選項2聽起來像一個很好的計劃。 – James

回答

3

如果您有somecol索引,那麼數據庫基本實現你的第二個方法。

當它掃描索引時,引擎可以採取兩種方法。它可以直接從索引中獲取計數,也可以使用索引獲取頁面。如果你有這樣的:

select count(anothercol) 
from mytable 
where somecol = 5; 

時發動機可以識別的行,其中somecol = 5,但它仍然有讀取數據頁確定anothercol是否爲NULL。

我很肯定count(*)只會掃描索引而不讀取數據頁面。如果你想確定然後使用:

select count(somecol) 
from mytable 
where somecol = 5; 
+1

關於'非常確定'http://stackoverflow.com/questions/10976328/mysql-count-performance-on-very-big-tables#comment14335228_10976328 –

0

選項2可能是一個索引的想法...有幾種類型的索引...我強烈建議您閱讀它們。那麼你可以製作自己的dicision。

很久很久以前,我用你的第二個選項來計數行並把值放在另一個表中。而且它比選項1更快......特別是如果數據很大的話。但你需要不斷更新它。

問候

0

它非常依賴於應用程序的類型。

如果您的閱讀操作(即後端系統)的更新更多,則第一個解決方案更容易,而且實際上更快,因爲您無需在每次更新時執行COUNT操作。

對於前端應用程序來說,第二個選擇更好,在前端應用程序中有很多需要計數結果的視圖,因此在十億行表上工作並不十分方便。使用此解決方案,您可以擁有一個自動觸發器來管理計數器更新,前提是該計數器一天不會更新上千次。