現在、各ビューをユーザー IP、ビュー日付などとともにデータベースに保存しています。しかし、私の Web サイトには多数のヒットがあり、データベースのロック時間が増加し、パフォーマンスが低下しています。
カウントを 1 時間ファイルに保存してからデータベースを更新することを考えていましたが、負荷の高いサイトではファイル操作を使用しないと誰かが教えてくれました。
これを行うための最善の戦略を提案してください。
注: ユニーク ビューを数える必要はありません。
現在、各ビューをユーザー IP、ビュー日付などとともにデータベースに保存しています。しかし、私の Web サイトには多数のヒットがあり、データベースのロック時間が増加し、パフォーマンスが低下しています。
カウントを 1 時間ファイルに保存してからデータベースを更新することを考えていましたが、負荷の高いサイトではファイル操作を使用しないと誰かが教えてくれました。
これを行うための最善の戦略を提案してください。
注: ユニーク ビューを数える必要はありません。
Web サーバーのログは、このデータの多くを既に追跡しています。
私がお勧めするのは、ログを 1 時間に 1 回ローテーションし、集計統計を生成して DB に保存するジョブをスケジュールすることです。
この情報を MySQL で直接保持および更新しても問題はありません。1 時間あたり 3000 ヒットとは、1 秒あたり 1 クエリ未満であることを意味します。このテーブルに InnoDB ストレージ エンジンを使用すると、ロックの問題が解消されます。ただし、InnoDB には多くのオプションがあり、効率的に機能させるには適切に構成する必要があります。これは重要です。
あなたのコメントに基づいて、あなたが求めている構造は次のようになると思います:
id - page id
type - period length, could be 'day', 'week', 'month'
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM
- depending on the contents of 'type' field
count - hit count for a url over given period
主キーは(type, period, id)
. また、効率的(id, period)
にインデックスを作成します。(type, period, count)
SELECT *
FROM ...
WHERE type='week'
and period = 20120409
ORDER BY count DESC
ページが作成されたら、count = 0 の各期間のレコードを挿入します。ページがヒットしたら、簡単な更新を実行します。
UPDATE table
SET count = count + 1
WHERE id = $page_id
AND period IN (201204, 20120409)
「日」、「週」、および「月」統計の 3 つのレコードすべてを更新します。
これを非常に効果的に行うプラグインが既にあります (ただし、データを使用して投稿を並べ替えるなどの作業を行う必要があります): BAW Post Views Count. すべてを postmeta に保存するので、簡単にアクセスでき、毎日の合計とその他の合計を個別のメタ エントリに保持します。私はそれをいくつかのサイトで使用しており、1 日に 50,000 ページ ビューが表示されますが、速度が低下することはありません。