2011-12-30 75 views
0

我工作的系統稍微複雜一些,但我可以將其簡化爲更簡單。mysql:連接訪問者的平均時間 - 優化

比方說,我有一個簡單的聊天服務器,我計算每個客戶端保持連接的秒數,並將其保存在表中(我正在使用mysql)。 因此,每次客戶端連接時,我都會保存他以秒爲單位保持連接的時間(int) 如果他斷開並再次連接,我將此信息保存在另一行中,因爲這是我想要的。一天中客戶端連接服務器的次數在50k-500k甚至更多(我知道,我知道但這與我的複雜系統有關,但與我的問題無關)。

我的問題是,我想向每個客戶展示他的訪問類似於谷歌分析(按天)的一些統計數據,更具體地說,我有興趣展示他在某一天度過的平均時間。

我正在尋找一個優化的方式來做到這一點。到目前爲止,我已經想過了以下解決方案:

  1. 使用選擇表,其中日期= ....但可能會出現速度問題

  2. 節省時間平均在一個單獨的AVG(時間)每天和用戶的表。這個解決方案沒問題,但提出了另一個問題:我如何節省平均時間?這裏有我的想法的情況:

一)使用mysql觸發每次客戶端連接(使用INSERT後及時更新統計...)這種解決方案並不差,但就像我說的客戶端可以連接500k次/天,這意味着500k次mysql需要計算平均時間

b)創建一個類似於cron作業或計時器任務的獨立應用程序,每隔X小時更新統計信息,這樣我就知道mysql根據我擁有的客戶端數量,服務器將僅在幾個小時內使用一次。

到目前爲止,我正在考慮實施2.b解決方案,但我說在繼續之前先詢問你。如果你有更好的想法,請分享。

感謝

回答

1

您可以使用解決方案,但不一遍遍重新計算平均值。您可以通過存儲當前平均值和用於計算平均值的項目數量來完成此操作。你的公式是這樣的:

(current_average*number_of_old_items+new_value)/(number_of_old_items+1)

1

在我看來,這樣的:可能出現

速度的問題是不夠的理由,以避免什麼肯定是最簡單和最是容易出錯的解決方案,特別是在發生速度問題時如此容易更改。

如果出現速度問題,我認爲這是—,我同意你的評估:最好使用計算平均值的計劃作業,而不是添加觸發器,以便對每個插入點施加懲罰。