0

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

  • ページビューがいつ発生したかを追跡する方法はありません。単純に増分されます。
  • 私が理解している限り、テーブルを更新すると、行の MySQL キャッシュがクリアされることが多いため、その行の次の SELECT が遅くなります。


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

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

(サイトは PHP 5.2、Symfony 1.4、および Doctrine 1.2 で構築されています)

編集:
目的はウェブ分析ではありません-私はそれを行う方法を知っており、それはすでに実施されています。次の 2 つの目的があります。

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

4 に答える 4

1

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

それが役立つことを願っています

于 2009-11-26T07:49:30.627 に答える
0

それを行う場合は、各アクセスをログに記録してみませんか?MySQLは連続テーブルの挿入を非常にうまくキャッシュできるので、挿入による顕著な速度低下はないはずです。いつでも[プロファイルの表示]を実行して、パフォーマンスの低下が実際に何であるかを確認できます。

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

于 2009-11-26T05:53:55.663 に答える
0

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

また、あなたがそれを行っている正確な理由が何であるかはよくわかりません.マーケティング/ウェブ統計の目的である場合は、その目的のために作成されたツールを使用することをお勧めします.

現在、Web サイトのアクセス統計を把握できる 2 つの大きなツール ファミリがあります。ログ ベースのツール (おそらくawstatsが最も一般的) と、ajax/1 ピクセル イメージ ベースのツール ( Google アナリティクスが最も一般的です) です。

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

また、もう 1 つの考えられる解決策はmemcachedを使用することです。このデーモンは、インクリメントできるある種のカウンターを提供します。そこにビューを記録し、毎日結果を収集するスクリプトを作成できます。

于 2009-11-26T02:40:13.650 に答える
0

Rage と同じように、何百万ものサードパーティのログ ツールが存在する場合、自分で行っても同じ結果を得ることはできません。日常的に追跡している場合、Webtrends などの基本的なプログラムは、追跡したい項目の ID が URL に含まれている場合は特に、ヒットを完全に追跡できます... これはいくら強調してもしすぎることはありません。これらのツールに関する URL について (たとえば、Wordpress では、さまざまな URL 構成が多数許可されています)。

さて、「インプレッション」トラッキングを検討している場合、それは別の球技です。おそらく、各オブジェクト、ページ、ユーザー、およびページ上の位置に基づく加重値をトラッキングしているからです。この場合、別のサーバーで追跡をホストすることでパフォーマンスを維持できます。以前は、ID と日付の文字列バージョンに対して SQL 更新を使用してこれを処理していました...そのように、日付が 20091125 から 20091126 に変更された場合、datediff 関数などのオーバーヘッドのない単純なクエリになります。

于 2009-11-26T02:52:27.290 に答える