2015-09-11 75 views
0

我有一個joblisting網站創建使用ASP.NET和DB是MYSQL。顯示記錄計數的最佳方法?單獨的桌子? MySQL查詢緩存?從選擇查詢計數?

在那裏用戶可以通過選擇他們的國家空位。每個工作都有自己的類別。我想要做的是在每個地點和每個類別前面顯示櫃檯。

我通常會這樣做,通過使用左連接從查詢中獲取行計數器。

那麼考慮性能是一個好方法嗎?

如果我維護一個單獨的表來存儲計數器,該怎麼辦?如果用戶放置廣告,計數器將增加1,如果刪除或過期,則計數器減1。請記住,數百萬用戶同時投放廣告。這是否會導致鎖定?

我也聽說了MySQL查詢cache.I沒有一個關於這個

這個網站獲得許多日常頁面點擊想法。接近200萬。

否則是否有最好的方法來做到這一點?請記住,我不想告訴那個數據庫的確切記錄。用戶不關心你所知道的。但準確性應該在特定的時間。

MSSQL用戶請注意。謝謝

回答

1

發出一個left join + group by查詢每次有人看到一個國家或類別聽起來不是一個好主意。這很可能會導致表現不佳。

MySQL查詢緩存可能會有所幫助,但我不會依賴它。

單獨存儲計數器會使您的數據非規格化,這可能會導致計數器與實際數據不同步(例如,如果您手動修改作業列表或通過不更新計數器的代碼修改作業列表)。

它對於計數器總是精確有多關鍵?我敢打賭,這並不重要。因此,我會實現應用程序級緩存(存儲在例如ASP.NET Application State中),爲每個國家和每個類別存儲一個計數器。將緩存封裝在將從緩存中獲取數據的類中,除非它自上次更新以來已經過N分鐘。否則,首先發出數據庫查詢以使用當前數據更新緩存(請記住將此邏輯用lock()包圍或使用您選擇的另一個線程安全機制)。

+0

你用lock()來包圍這個邏輯是什麼意思? – Banjo

+0

請參見[lock語句](https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx?f=255&MSPPError=-2147217396)。您想確保兩個線程不會同時更新緩存。 –

0

在每天200萬次查詢中,您可能還沒有陷入困境,但卻越來越接近。

查詢緩存是而不是一個可行的解決方案。每次對該表的寫入都會使中的每個條目在該表中無效。除非讀取次數明顯多於寫入次數,否則QC是一種浪費。

你說確切的數字並不重要?然後我建議:

  • 有一個單獨的計數表。
  • 有一個後臺工作敘述所有事情,但要小心不要長時間持有任何鎖。如果您有複製功能,請考慮從從服務器讀取數據並寫入主服務器。
  • 該表只有類別和計數,因此它很小且可緩存(在引擎的常規緩存中,而不是QC)。

通過拉出主表的計數,削減對主表的影響。

如果您需要進一步的幫助,請提供SHOW CREATE TABLESELECT ... GROUP BY ...,這將生成所有計數。這應該會給我們更多關於你在使用什麼的細節,儘管這個查詢可能不是直接可行的。