質問

ユーザーが非常に多くの投稿を閲覧できるサイトがあります。これが完了するたびに、 UPDATE table SET views = views + 1 WHERE id =?のようなクエリを実行します。ただし、このアプローチには多くの欠点があります:

  • ページビューが発生したときを追跡する方法はありません-単にインクリメントされます。
  • テーブルを更新すると、多くの場合、私の知る限り、行のMySQLキャッシュがクリアされ、その行の次のSELECTが遅くなります。

したがって、テーブルを作成するアプローチを採用することを検討します。
object_views {object_id、year、month、day、views} 。各オブジェクトには1行があります。この表の日。その後、 objects テーブルのビュー列を定期的に更新して、常に高価な結合を行う必要がないようにします。

これは私が考えることができる最も簡単な解決策であり、パフォーマンスへの影響が最も少ないものでもあるようです。同意しますか?

(このサイトはPHP 5.2、symfony 1.4およびDoctrine 1.2上に構築されています)

編集:
目的は、ウェブ解析をしない-私はそれを行う方法を知っています、そしてそれはすでに整っています。 2つの目的があります:

  • 特定のオブジェクトが表示された回数(たとえば、今日または昨日)をユーザーに確認させます。
  • サイトのモデレーターに、Googleアナリティクス、Omniture、またはその他のソリューションにアクセスすることなく、統計を表示するシンプルを許可します。さらに、バックエンドの結果はリアルタイムでなければならず、現時点ではGAが提供できない機能です。 Analytics APIを使用して使用状況データを取得したくありません(リアルタイムではなく、GAにはJavaScriptが必要です)。
役に立ちましたか?

解決

Quote:私が理解する限り、行のMySQLキャッシュをクリアし、その行の次のSELECTを遅くすることが多いテーブルを更新します。
これ以上のものがあります。これはデータベースキラーです。 このようなテーブルを作成することをお勧めします: object_views {object_id、timestamp} この方法で、object_id(count()関数)で集計できます。 したがって、誰かがページを表示するたびに、テーブルにレコードを挿入します。 時々、テーブルの古いレコードを消去する必要があります。 UPDATEステートメントはEVILです:) ほとんどのプラットフォームでは、基本的に行に削除済みのマークを付け、新しい行を挿入して、テーブルを断片化します。ロックの問題は言うまでもありません。

役立つこと

他のヒント

Rageと同じラインに沿って、サードパーティのログツールが100万個ある場合、同じ結果を得ることはできません。あなたが毎日追跡している場合、webtrendsなどの基本的なプログラムは、特に追跡したいアイテムのIDがURLに含まれている場合、ヒットを完全に追跡できます...私はこれを十分に強調することはできません、それだけですこれらのツールに関しては、URLについて(たとえば、Wordpressは多くの異なるURL構造を許可します)

「インプレッション」を検討している場合は、あなたはおそらく各オブジェクト、ページ、ユーザー、そしておそらくページ上の場所に基づいて重み付けされた値を追跡しているので、それは別のボールゲームです。この場合、追跡を別のサーバーでホストすることでパフォーマンスを維持できます。別のサーバーでは、発射して忘れることができます。これまでは、IDと日付の文字列バージョンに対してSQL更新を使用してこれを実行していました...そのように日付が20091125から20091126に変更されると、datediff関数などのオーバーヘッドのない単純なクエリになります。

最初に、 DATETIME で年、月、日を集計しない理由について簡単に説明します。

また、あなたがそれをしている正確な理由が本当に分からない。もしそれがマーケティング/ウェブの統計目的のためなら、その目的のために作られたツールを使うほうが良い。

今では、ウェブサイトへのアクセス統計、ログベースの統計( awstats はおそらく最も人気があります)、ajax / 1pixel画像ベースのもの( google分析最も人気があります)。

独自の統計データベースを構築する場合は、おそらくPHPを使用してログパーサーを簡単に構築できます。 Apacheログ(またはIISログ)の解析に負担がかかりすぎる場合は、おそらくより簡単な方法でフォーマットされたカスタムログをアプリケーションに出力させるでしょう。

また、他の可能な解決策の1つは、 memcached を使用することです。デーモンは、 href = "http://www.php.net/manual/en/memcached.increment.php" rel = "nofollow noreferrer">インクリメント。そこにビューを記録し、毎日結果を収集するスクリプトを作成できます。

そうするつもりなら、なぜ各アクセスをログに記録しないのですか? MySQLは挿入を連続テーブルに非常にうまくキャッシュできるため、挿入による顕著なスローダウンはありません。いつでもプロファイルを表示パフォーマンスのペナルティが実際に何であるかを確認します。

日時の問題では、いつでも GROUP BY MONTH(accessed_at)、YEAR(accessed_at)または WHERE MONTH(accessed_at)= 11 AND YEAR(accessed_at)= 2009

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top