页面点击计数器 - 我是否过度使用数据库?

时间:2015-03-16 13:55:55

标签: php mysql hitcounter

我在我的网站上建立了一个简单的点击计数器(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。如果是,我将hits的值增加1.如果不是,我在表中创建一个新行。时间戳允许在命中计数之间存在一定的延迟,以便不将页面刷新计为新命中。

这一切都很好用,但我担心我的数据库可能会超负荷... 在不到24小时内,page_hits表中有超过6500行。

所以我的问题是:在我的数据库中拥有如此快速增长的表有什么风险? (性能问题?超出数据库大小限制?)

1 个答案:

答案 0 :(得分: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))

现在我可以看到那里有什么。

你的桌子并不复杂,但它会快速增长。这不会是一个问题,只要你不做任何事情。换句话说:即使您有一百万行,向表中添加行也不成问题。

然而,只要您开始查询此表,您就会发现它很快就会变慢。您已经忘记添加索引。

How do I add indices to MySQL tables?

其次,您可以考虑规范化您的表并摆脱不必要的信息。例如这三个较小的表:

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_id表示pages表,client_id表示clients表。您必须自己添加索引。我会摆脱date列,并用cookie解决这个问题。请注意,可以轻松扩展新表以包含更多信息,而不会太快。