2012-05-09 16 views
3

1つのコードベースから複数のWebサイトを実行するWebアプリケーションがあります。私はそれがアプリケーション上で実行されるサイトとドメインを含むテーブルでセットアップしています。アプリケーションは訪問者を追跡するので、サイトごとに、そしてアプリケーションのグローバルベースでどれだけのトラフィックが得られているかを知ることができます。PHP Mysqlは訪問者のスケーラビリティを追跡します

私が遭遇している問題は、そこに250万のレコードがあるので、訪問者の追跡が非常に遅いということです。今月の訪問者数を取得するためにクエリを実行すると、データにアクセスできなくなるため、複数の時間がかかります。

システムは、他のすべてのファイルを含む基本PHPファイルから直接トラッキングを記録しています。これは、既存の識別Cookieが見つからない場合に、訪問者テーブルにレコードを作成します。レコードを作成するときに、ユーザーにクッキーが割り当てられます。その結果、訪問者レコードが1つだけ作成されます。訪問者の記録には、閲覧したページ数とそのページに入ったページ(入力ページ)と、最後に見たページ(終了ページ)が格納されます。

私たちはかなりのトラフィックを得ており、結果をスピードアップすることで、毎月の訪問者のこのレポートをアクセス可能にしたいと考えています。

我々が分析に自分自身を追跡する代わりに、Google Analyticsのようなツールを使用してすることを決めた...

を私は前にSITE_IDと日付にインデックスを追加しようとしているが、非常に物事をスピードアップしていないようでした私たちは後でもっと意味のあるデータを作成することができます。たとえば、サイトを閲覧しているユーザーが連絡フォームを送信してCRMの連絡先になったときなど、その連絡先の履歴を確認してサポートを求める前に閲覧したページを確認したい場合など。

提案がありますか?テーブルスキーマは以下のとおりです。事前におかげさまで、私は解決策を考案しようと壁に頭を叩いています。

CREATE TABLE `analytics_track_visits` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT 
    ,`site_id` int(4) unsigned default NULL 

    ,`inc` bigint unsigned default NULL 
    ,`referer` text NOT NULL 
    ,`refer_host` text NOT NULL 
    ,`user_agent` text NOT NULL 
    ,`browser` text NOT NULL 
    ,`os` text NOT NULL 
    ,`search_term` text NOT NULL 

    ,`entry_page` int(4) unsigned default NULL 
    ,`entry_page_url` text default NULL 
    ,`exit_page` int(4) unsigned default NULL 
    ,`exit_page_url` text default NULL 

    ,`created` datetime NOT NULL 
    ,`created_ip` varchar(200) NOT NULL default '' 
    ,`created_user_id` int(4) unsigned default NULL 
    ,`modified` datetime NOT NULL default '0000-00-00' 
    ,`modified_user_id` int(4) unsigned default NULL 

    ,PRIMARY KEY(`id`) 
    ,CONSTRAINT `analytics_track_visits__site` FOREIGN KEY (`site_id`) 
     REFERENCES `site` (`id`) ON DELETE CASCADE 
    ,CONSTRAINT `analytics_track_visits__entry_page` FOREIGN KEY (`entry_page`) 
     REFERENCES `page` (`id`) ON DELETE CASCADE 
    ,CONSTRAINT `analytics_track_visits__exit_page` FOREIGN KEY (`exit_page`) 
     REFERENCES `page` (`id`) ON DELETE CASCADE 
) ENGINE=INNODB; 

incは、特定の訪問者が閲覧したページ数を格納します。 entry_pageは、cmsページテーブルの外部キーです(exit_pageと同じです)。 browserosホールド値はuser_agentから解釈されます。 search_termには、エントリページの検索に使用されたキーワードがすべて格納されます。 site_idは、doman名のサイト設定のリストを含むテーブルに関連しています。

私は、問題の一部はテーブルが実際には壊れないという疑いがあるので、レポートを実行するときに同時にこのテーブルを挿入して更新するアクティブなクエリがあります。

+1

このデータはすべて、Webサーバーのログファイルの分析から取得できます...なぜこのオーバーヘッドをすべて追加しますか? – eggyal

+1

ログファイルよりも優れています.Google Analyticsを使用してください。 APIがあるので、必要なカスタムレポートを作成できます。 – Conor

+1

データは、これを記録することから得ようとしている限り、より深く進んでいます。 Webアプリケーション自体にはさまざまな機能領域があり、最終的にはユーザーがライブチャットをヒットし、ユーザーの最後の20ページと操作を即座に表示できます。または特定のCRM連絡先がサイトで閲覧した場所を確認するためのトラッキング製品、ページID、チャットセッションなどの関係のデータをサーバーログの分析から掘り起こすのは難しいです。私は一般的なサイトの統計情報については考慮しました。 – Mike

答えて

0

あなたはその上で実行しているクエリの種類を知らなくても、あなたが考慮する必要がありますいくつかあります:

  • は、サイトごとに別々のテーブルを作成します。私はそれがすばらしい解決策のようには見えないが、あなたのテーブルの別の高価なインデックスが不要になることを知っています。
  • レポートクエリを実行するための読み取り専用スレーブを設定します。これによりメインデータベースの負荷が軽減されます。
  • 私は、InnoDBがすべての外部キーのインデックスも作成すると信じています。これはあなたのテーブルのサイズに役立ちません(それはまた、挿入を遅くします)。あなたが定期的にページを削除しない限り、あなたはそれらを使わずに済むでしょう。

私はもっと多くのヒントを追加します。

+0

ありがとうございます。analytics_track_visitsからrow_countとしてselect count(*)などのレポートクエリを実行しています(site_id = 10のところで、 '2012-01-01 00:00:00'と '2012-01-30 00:00: 00 ' – Mike

+0

@Mike質問にはすべて「site_id」と日付範囲がありますか?もしそうなら、範囲照会を利用するために 'site_id'と' created'に複合インデックスを導入することができます。私はちょうど正確にインデックスを作成する順序ではわからない:) –

+0

ヒントのおかげで、私はレポートのクエリの90%がsite_idと日付の範囲を持つつもりだと思います。一部のグローバルレポートではsite_idはありませんが、すべての訪問者をすべての訪問者で見ることはあまり役に立ちません。私はインデックスのいくつかの異なる組み合わせを試して、何が一番うまくいくかを見なければならないと思っています。これまでかなり有益でした。 – Mike

1

250万レコードはそれほど大きなテーブルではありません。私は2500万レコード以上のログテーブル(アクションの記録、サインイン、サインアウト、価格の変更など)を持っています。あなたが、私は信じて可能な限り最高の指数を与える必要がありINDEX (idx_lookup (site_id, created_date):あなたはsite_idcreated(日付部分のみ)で照会する場合は

は、私はタイプ日付のcreated_dateなどのインデックスを作成することをお勧め。

+0

ええ、250万人ほどではありません。クライアントは5秒以内に分析画面を表示したいと考えています。現在は約1〜2分で読み込みます。私はこれをより速く読み込むための良い方法がなければならないと思います、あるいは、おそらく私はそれにハードウェアを投げつけることに固執しています。私はインデックスで少し遊んで、それが役立つかどうかを見てみましょう。 – Mike

+0

インデックスが役立たない場合は、より良いハードウェアがおそらく唯一の他の選択肢になります。より多くのメモリから始めます。 – Echo

関連する問題