2012-04-06 8 views
1

私は10,000のMYSQL行ではあまり問題にはならないと確信していますが、もし何十万行、何百万行もあればどうでしょうか?IPアドレスに敏感なビューカウンタを使用すると、MYSQL/PHPの負荷が大きすぎますか?

私はルーキープログラマーなので、クッキーを使って問題を解決できるかもしれませんが、クッキーを使用すると問題が解決される可能性があります。

代替手段はありますか?または、私は非IPに敏感なカウンタに固執する必要がありますか?私のアプリケーションでは、このカウンタは、アイテムではなくアイテムの売り手のみが見ることができます。そのうちのいくつかは、カウンタで遊んで何度もリフレッシュしたい場合があります。カウンターが見えない場合は、爽やかに遊びません。事前に

おかげで、

よろしく

答えて

1

IPアドレスは基本的には整数です。

これらを整数として格納し、対応する列のインデックスを使用します。クエリは非常に高速になります。 ipv6アドレスは32ビット整数では大きすぎるので、代わりにvarchar(16)を使用して、IPアドレスのバイナリ表現を保存することを検討してください。

あなたのアプリケーションのパフォーマンスに関して、私の意見では、この種の統計情報のためにある種のキャッシュシステムを使用することは常に良いことです。たとえば、特定の時間間隔が経過した場合にのみ、統計を再生成します。

+0

お返事ありがとうございます。 IPアドレスがドットであるため、IPアドレスが整数であるとは思っていませんでした。キャッシュ側はPHP側かMYSQL側で行うべきですか?ありがとう、よろしくお願いします。 – alexx0186

+0

PHPでキャッシュ - 最後のクエリが30分​​以上前に行われた場合にのみ、mysqlクエリを実行します。結果とクエリ時間をファイルに保存し、必要な場合にのみ新しいファイルを生成します。あなたはまた、混合アプローチで行くことができ、キャッシュ情報を保持する別のmysqlテーブルを作成します。 IPアドレスを数値表現に変換するには、php関数ip2longとバイナリチェックinet_ptonをチェックします。 – Mikk

+0

こんにちは、お返事ありがとうございます。私はそれを調べます。よろしくお願いいたします。 – alexx0186

1

これにはさまざまな方法があります。 1つの方法は、item_id、ip_addressおよびdateのログに3つの列すべてにわたってユニークなインデックスを付けることです。次にINSERT IGNOREをテーブルに入れます -

CREATE TABLE `test`.`view_log` (
    `item_id` INTEGER UNSIGNED NOT NULL, 
    `ip_address` INTEGER UNSIGNED NOT NULL, 
    `date` DATE NOT NULL, 
    PRIMARY KEY (`item_id`, `ip_address`, `date`) 
); 

INSERT IGNORE INTO view_log ($item_id, INET_ATON('$ip_address'), CURRENT_DATE); 

注:これはIPv4でのみ有効です。 IPv6をサポートするには、IPアドレスを格納するための別の方法を使用する必要があります。

+0

こんにちは、お返事ありがとうございます。私はgoogleで "INSERT IGNORE"コマンドを調べましたが、カウンタの場合に何が使用されているのか正確にはわかりません。その目的は何ですか?あなたの助けをたくさんありがとう – alexx0186

+0

アイデアは簡単です。 3つの列にわたるユニークなインデックスのため、1人のアイテムにつきユーザー1人につき1つのエントリしか得られません。同じMySQLを別の行に挿入しようとすると、重複キーエラーがスローされます。 ignoreを使用するだけで、エラーが抑止され、代わりに警告が返されます。 – nnichols

関連する問題