2

我在我的网站上构建了一个简单的计数器(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))

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

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

但是,一旦您开始查询此表,您会发现它很快就会变慢。您忘记添加索引。

如何向 MySQL 表添加索引?

其次,您可以考虑规范化您的表格并删除不需要的信息。例如这三个较小的表:

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_idclients表。您必须自己添加索引。我将摆脱该date列,并使用 cookie 解决此问题。请注意,新表可以轻松扩展以包含更多信息,而不会太快变得太大。

于 2015-03-16T14:07:17.057 回答