2009-09-08 106 views
0

在交通非常繁忙的LAMP服務器上,我使用內存表來跟蹤多個數據項作爲計數器。它的實現是這樣的:Php - 優化多個計數器增量

$query = "INSERT INTO daily_info_mem SET di_num=1 ,di_type=9, di_date = current_date(), di_sid= $sid_int ,di_name='user_counter' ON DUPLICATE KEY UPDATE di_num=di_num+1"; 

索引設置獨特di_type和日期,因此,如果存在對於這個日期計數器然後di_type它被遞增,如果不是爲了此日期和數據類型的行與0值創建。

對於每個頁面視圖有幾個這樣的查詢。這意味着幾個MySQL調用。

是否可以優化該儘可能地爲一個MySQL的通話將更新幾個任意櫃檯,仍然保持如果需要創建行或增加淡水河谷如果它存在的想法?

+0

爲什麼不使用自動增量這樣的東西來處理你的櫃檯? – 2009-09-08 09:53:45

+0

如果我是正確的,自動增量用於行級索引值。我正在增加一個字段,而不是行數 – Nir 2009-09-08 09:59:04

+0

你是指同一行內的「counter」字段嗎?像ON DUPLICATE KEY UPDATE di_num = di_num + 1,c2 = c2 + 99,c3 = c3 + 47? – VolkerK 2009-09-08 10:11:46

回答

3

我建議完全重新考慮這種類型的查詢。你在主要數據庫中有很多東西可以更好地處理內存。是否絕對需要每次都立即更新MySQL?如果你能從MySQL和memcached中獲得它,你會看到一個巨大的性能障礙,並且你可以隨時在後臺運行一個腳本來整理數據並定期將其推送到MySQL(比如說,每5分鐘一次),這樣你不要放任何東西。

如果絕對必須是在MySQL,你可能會更好使用HEAP表,而不是一個InnoDB表。你會失去「重複密鑰」,但你總是可以使用存儲過程/函數來進行更新。而且,您可以隨時將定時查詢/定時腳本「INSERT INTO ... SELECT FROM ...」更改爲archive型表格,這樣您就不會丟失任何東西。

或者,使用完全不同的數據庫來存儲您的統計數據。 MongoDB有upsert s和$inc rements,這使得它成爲統計收集的一個非常好的選擇。

+0

中的代碼謝謝! 這個工作表是一個內存表。我每15分鐘更新一次非內存表。 – Nir 2009-09-08 10:48:08

+0

然後我懷疑你已經達到了mysql可以爲你提供的極限; mysql是一個很棒的小數據庫,但它並不是一切的正確選擇。在這種情況下,Memcached或MongoDB更適合。 – 2009-09-08 10:50:30