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

Page hits counter - Am I overexerting the database?

我在我的网站上构建了一个简单的点击计数器(PHP & MySQL,使用 Codeigniter 作为我的框架)。

这是我使用的table:

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_urlip 的组合是否存在于 table 中。如果是,我将 hits 的值增加 1。如果不是,我在 table 中创建一个新行。时间戳允许点击计数之间有一定的延迟,以免将页面刷新计为新点击。

一切正常,但恐怕我的数据库可能超载了... 在不到 24 小时内,我在 page_hits table.

中有超过 6500 行

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

让我先重写你的单行 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))

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

你的table并不复杂,但会成长得很快。这不会成为问题,只要您不对其进行任何操作即可。换句话说:向 table 添加行不是问题,即使您有一百万行。

然而,一旦您开始查询这个 table,您就会发现它很快变慢了。您忘记添加索引了。

How do I add indices to MySQL tables?

其次,您可以考虑规范化您的 table 并删除不需要的信息。例如这三个较小的 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指的是pagestable,client_id指的是clientstable。您必须自己添加索引。我会去掉 date 列,并用 cookie 解决这个问题。请注意,新的 table 可以轻松扩展以包含更多信息,而不会很快变得太大。