2012-10-29 9 views
8

MySQLデータベースでカスタムOpenX広告サーバーを実行しています。 1日あたり100万回のクリックこのクリック情報をすべて保存し、それに基づいて統計情報を表示する必要があります。MySQLのソリューションは1日あたり100万クリックです

今、すべてのクリック情報が2日ごとに集計され、特定のクリック情報が削除されます。しかし、私たちはアフィリエイトに動的トラッキングID(TID)を設定し、基本的にこれに基づいてクリック数とコンバージョン数をトラッキングできる新しい機能を提供したいと考えています。

問題は、クリックテーブルが1日に最低100万エントリ増加することです。このテーブルを検索して、特定の期間、1人のユーザーのすべてのクリックを表示できるようにする必要があります。上記のTIDによってグループ化されているか、TIDによって検索されています。

私はMySQLのパーティションを見ましたが、それは良い解決策のようですが、巨大なデータベース(おそらく何十億ものエントリ)でもうまくいくかどうかはわかりません。

あなたはこの問題の正しいアプローチになると思いますか?

EDIT:あなたの回答に基づいて

、私は今、混合溶液と思っています。

我々はすでに、このようなものになりますクリックは、メンテナンス時に集約されたときにエントリが削除された「LIVE」テーブル、持って

表:

viewer_idをクリックし| ... | date_time |アフィリエイトID | ... | TID

(私はこの時点では重要ではないの列をスキップ)

メンテナンス時には、私は表を言って、ほとんど同じに見える別の毎月のテーブルにすべてを移動することができますインデックスを持っているclicks_2012_11date_time,affiliate_idおよびtidの場合、affiliate_idで区切られています。

だから今、アフィリエイトは、過去2ヶ月間、彼の統計情報を見たいとき、私は私が表内で見て知っている:clicks_2012_10表:clicks_2012_11(私はに限られた時間の範囲を持っています最大2ヶ月)。 affiliate_idでパーティション化されたテーブルがあるので、必要なパーティションのみが2つのテーブルから検索され、過去2か月間に何らかのアクティビティを持つすべてのTIDがリストされます。

このアプローチについてどう思いますか?明らかな問題はありますか?しっかりとした理由なしに物事を複雑にすることはできますか?

答えて

2

大きな( "巨大な")テーブルにはMySQLが失敗することは何もありません。

    • ディスク容量キャッシュ使用(あなたはメモリ内で実行することはできそうにない)
    • メンテナンス(スキーマの変更、再構築、...):ビッグテーブルは、ほとんどの面で問題があります

    これらのすべてに対処する必要があります。

    パーティション分割は、パーティション全体の削除などのバルクデータのメンテナンスに主に役立ちます。大きな表をデフォルトでいくつかの列に分割するのは確かにベストプラクティスではありません。パーティション化は、特定の理由で常に導入されます。

  • +0

    ありがとうございます。 このaffiliate_idはすべてのクエリのすべてのWHERE句に表示されるため、affiliate_idでテーブルをパーティショニングすることを考えています。特定のアフィリエイトIDの過去2ヶ月間の統計情報をすべて取得しようとすると、クエリのスピードアップに役立たないでしょうか?このアプローチの小型化はどうでしょうか? – user1782560

    +0

    あなたはそれを分割する必要はありません。 'affiliate_id、date_time desc'にテーブルをクラスタ化します。 – usr

    1

    検索の挿入と最適化の最適化は、通常は相互に排他的です。 2つのテーブルをお勧めします。

    live data: no (or minimal) keys, myisam to remove transaction overhead, etc... 
    historical data: indexed up the wazoo, with data moved over from the live data on a periodic basis. 
    
    関連する問題