2011-07-05 5 views
2

状況:大量のデータをデータベースから取得する必要があります(〜150k +)。その後、PHPを使用して、そのデータを1日の数字に基づいて分割し、それを数えます(1番目:〜10k、2番目:〜15k、など...)。そしてそれを実行した後、その情報をすべてJSON配列にフォーマットしてクライアントに戻し、これらの統計情報に関するグラフを表示する必要があります。MySQLからPHPまで、さらにはJSONのクライアントまで大規模なデータセットを扱います

これですべてがPHPでうまく処理できることは確かですが、おそらくサーバー+帯域幅に多くの負荷がかかります。特に、クライアントが更新された統計情報を表示するためにページを更新している場合は特にそうです。彼らは毎日約5k +アクティブなユーザーであるため、多くのデータがフェッチされます。

これを処理するにはどうすればよいでしょうか?

注:サーバーには4GBのDD3 RAMが搭載されています。

答えて

0

短い答え:毎回計算を実行しないでください。計算結果をデータベーステーブルに保存し、それらの結果を返します。

長い答え:上記と同じですが、それはあなたがあなたのデータがあることを期待どれだけ最新に基づいてトリッキーなことができます理解しています。更新されたデータが結果セットをどれだけ無効にしたかを考慮して、その回りをデザインします。

2

どのような種類のキャッシングメカニズムを実装したいので、各ユーザーの粒度は(1)1分に過ぎません。こうすることで、ユーザーがリフレッシュを叩いても、1分間に1回だけdbクエリ/データ照合を実行し、それ以外の場合は以前の結果を取得します。

データがユーザー間で比較的同じ場合、データベースの負荷がさらに軽減されます。各ユーザーのヒットは10秒ごとに更新され、データセットが10%、他のユーザーに共通していると仮定すると、1分の粒度であたり、クエリキャッシュを行うと

150,000 rows * 1 times per minute * 500 users = 75 million rows fetched. 

150,000 rows * 6 times per minute * 5000 users = 4.5 billion rows fetched 

からあなたを取ります(たとえば、行の1/300がフェッチされます)。

+0

お返事ありがとうございます。データはアカウントにのみ関連しているため、すべてのデータはすべてのユーザーに固有です。 PHPが生成した情報を別のInnoDBテーブルにキャッシュし、その後10分ごとにすべてのデータをダンプし、ユーザーが再びページに当たると再現することを考えています。 – kashn