2

Web サイトに単純なヒット カウンターを作成しました (PHP と MySQL、フレームワークとして Codeigniter を使用)。

これは私が使用するテーブルです:

CREATE TABLE page_hits (id INT NOT NULL AUTO_INCREMENT, page_url VARCHAR(350) NOT NULL, ip VARCHAR(11) NOT NULL, hits INT NOT NULL, `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP  NOT NULL, PRIMARY KEY (id));

ページが読み込まれるたびに、page_url&の組み合わせがipテーブルに存在するかどうかを確認します。一致する場合は、値をhits1 増やします。そうでない場合は、テーブルに新しい行を作成します。タイムスタンプは、ページの更新を新しいヒットとしてカウントしないように、ヒット カウント間の一定の遅延を許容するためにあります。

それはすべてうまく機能しますが、データベースが過負荷になっているのではないかと心配しています... 24 時間以内に、page_hitsテーブルに 6500 行以上あります。

私の質問は次のとおりです。データベースにこのように急速に成長するテーブルがあることのリスクは何ですか? (パフォーマンスの問題? データベース サイズの制限を超えていますか?)

4

1 に答える 1

1

単一行の SQL コマンドを書き直すことから始めましょう。

CREATE TABLE page_hits 
(id       INT NOT NULL AUTO_INCREMENT, 
 page_url VARCHAR(350) NOT NULL, 
 ip       VARCHAR(11) NOT NULL, 
 hits     INT NOT NULL, 
 date     TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, 
 PRIMARY KEY (id))

今、私はそこにあるものを見ることができます。

テーブルは複雑ではありませんが、すぐに大きくなります。何もしない限り、これは問題になりません。つまり、100 万行ある場合でも、テーブルに行を追加することは問題ではありません。

ただし、このテーブルのクエリを開始するとすぐに、速度が非常に速くなることがわかります。インデックスを追加するのを忘れました。

MySQL テーブルにインデックスを追加するにはどうすればよいですか?

次に、テーブルを正規化し、不要な情報を取り除くことを検討できます。たとえば、次の 3 つの小さなテーブル:

CREATE TABLE page_hits 
    (id         INT NOT NULL AUTO_INCREMENT, 
     page_id    INT NOT NULL, 
     client_id  INT NOT NULL, 
     hits       INT NOT NULL, 
     PRIMARY KEY (id))

CREATE TABLE pages 
    (id       INT NOT NULL AUTO_INCREMENT, 
     page_url VARCHAR(350) NOT NULL, 
     PRIMARY KEY (id))

CREATE TABLE clients 
    (id       INT NOT NULL AUTO_INCREMENT, 
     ip       VARCHAR(11) NOT NULL, 
     date     TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, 
     PRIMARY KEY (id))

ここでpage_idpages表をclient_id参照し、表を参照しclientsます。インデックスは自分で追加する必要があります。列を取り除き、dateこの問題を Cookie で解決します。新しいテーブルは、すぐに大きくなりすぎることなく、より多くの情報を含むように簡単に拡張できることに注意してください。

于 2015-03-16T14:07:17.057 に答える