人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

去年、php+mysqlでサイトのアクセス解析のシステムを作成し納品しました。
仕組みとしては単純で1アクセス、1レコードでテーブルに保存して解析画面で様々な条件クエリで合計数やグラフなどを表現しています。

現在、問題が発生していて。解析画面でエラーがでてしまいます。
レコード数が20万近くになり処理ができなくてエラーが出ているようです。

色々な解決方法があると思うのですが最適だと思う処理をお教えください。


●質問者: php-beginner
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL PHP アクセス アクセス解析 エラー
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● b-wind
●19ポイント

1アクセス、1レコード

レコード数が20万近くになり

このデータ形式でこの量になってくると力業では解決は難しい。


一般的にはリアルタイム解析を止め、別テーブルとして解析後のデータ(もしくは解析しやすい中間データ)に

バッチ処理で変換し、そこから解析データを引っ張ってくるように変更するのが無難かと。

通常のアクセス解析であれば、1分1秒に対し正確なデータを求めることは少ないし。


データ取得部分がごっそり変更になるだろう事がデメリットではあるが。


2 ● pahoo
●18ポイント

アクセスログは、MySQLのようなRDBMSに格納するのではなく、テキストファイルにした方がいいでしょう。


RDBMSは、検索・閲覧といった再利用(参照)を頻繁に行うケースでは威力を発揮しますが、アクセスログのように、参照より書き込みの方が多い場合には処理時間がかかるだけで、何のメリットもありません。

アクセス解析は毎秒毎秒行うような性質のものではありませんから、テキストファイル処理で十分対応できます。


もしApacheを併用しているのでしたら、Apache の生ログ(テキスト)をそのまま解析する方がシステムに負荷をかけません。


3 ● hijk05
●19ポイント

(1)非同期処理にする

(2)中間データを随時作成して、集計するレコード数を少なくする

(3)10万レコード単位にテーブルを別にして、処理を行う。

10万レコードごとにテーブルが増えるという形にする

3つぐらいが対策として考えられます。


4 ● matsuoki
●18ポイント

あんまりキレイじゃ無いので好きな処理方法じゃ無いんですが、月が変わる毎にテーブルを作って、データの格納先を変える、という方法も有ります。

某市のとある監視システムがそうなってました。そのシステムは、1分あたり100以上のレコードが発生します。

cronなりphpなりで、毎月1日(か、出来れば前の月の最後あたり)に create tableをしてテーブルを作ります。

欠点

・取ってくるデータによってテーブルが変わってしまうので、その部分の変更が必要になるかもしれません。

例:取ってくる日付・期間からテーブル名を取得してunionクエリを発行する。期間が長いとSQL文が超大作になりそうです。

・ストアドプロシージャにした場合、コストがあまり低くなりません。(mysqlでテーブル名が可変なストアドが作れるのかどうか知りませんが。。。)


5 ● imaiworks
●18ポイント

1テーブルで20万はそこそこ厳しいですが、

パーティショニングで日ごとに分割するのはどうでしょうか?

http://dev.mysql.com/doc/refman/5.1/ja/partitioning-subpartition...

集計も日ごとにwhere指定すると思いますから、早さも求めれます、、

が、1024個までしか分割ができないので、1日1分割だと3年持たないのが厳しいところで、

2日に1分割とか、レコード数にあわせてパーティショニング設計が必要です。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ