2011-12-30 9 views
0

私が動作するシステムはここで説明するのが少し複雑ですが、私はそれをより簡単なものに減らすことができます。mysql:接続された訪問者の平均時間 - 最適化

私はシンプルなチャットサーバーを持っていて、すべてのクライアントが接続したままになっている秒数をカウントしてテーブルに保存します(私はmysqlを使用しています)。 クライアントが接続するたびに、接続されている時間を秒単位で保存します(int) 彼が切断して再び接続すると、この情報は別の行に保存されます。クライアントが1日にサーバに接続する回数は、50k〜500kまたはそれ以上です(私は知っていますが、これは私の複雑なシステムに関連していますが、私の質問とは無関係です)。

私の問題は、グーグルアナリティックスに似た訪問者の統計情報(日数)をすべてのクライアントに表示したいということです。具体的には、特定の日に費やした平均時間を表示することに興味があります。

私はこれを行う最適な方法を検討しています。これまでのところ私は、次の解決策について考えてきました:

  1. 使用は日付が= ....しかし、スピードの問題が

  2. が別々に平均時間の節約に発生する可能性があるテーブルから平均(時間)を選択します毎日とユーザーのためのテーブル。このソリューションは問題ありませんが、平均時間をどのように保存すればよいですか?

統計にクライアントは、私がクライアントを言っしかし同様に、このソリューションが悪いわけではない)... AFTER INSERTを使用して(接続されるたびに更新するために、MySQLのトリガーを使用A):ここで私が考えていた状況があります平均500時間を500k回接続することができます。mysqlは平均時間を計算する必要があります

b)cronジョブや、X時間ごとに統計を更新するタイマータスクと同様の別のアプリケーションを作成します。サーバーは、私が持っているクライアントの数に応じて数時間に1回しか使用されません。

これまでのところ、私は2.bソリューションを実装することを考えていますが、先に進む前にまず尋ねると言いました。あなたが良いアイデアを持っている場合は、共有してください。

おかげ

答えて

1

あなたはA液を使用することができますが、何度も何度も平均値を再計算しません。現在の平均値と、平均値の計算に使用されたアイテムの量を格納することによって、これを行うことができます。あなたの式は次のように次のようになります。

私の意見では

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

1

、この:

スピードの問題は

を発生する可能性がある、確かに最も簡単であるかを回避するのに十分な理由ではありませんエラーが発生しやすいソリューションです。特に、スピードの問題の場合は、が発生した場合に変更が容易です。

スピードの問題が発生した場合にはと言われています。すべてのインサートにペナルティを課すトリガーを追加するよりも、平均を計算するスケジュールされたジョブを使用する方が良いと思います。

関連する問題