页面点击计数器 - 我是否过度使用了数据库?
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_url
和 ip
的组合是否存在于 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
指的是pages
table,client_id
指的是clients
table。您必须自己添加索引。我会去掉 date
列,并用 cookie 解决这个问题。请注意,新的 table 可以轻松扩展以包含更多信息,而不会很快变得太大。
我在我的网站上构建了一个简单的点击计数器(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_url
和 ip
的组合是否存在于 table 中。如果是,我将 hits
的值增加 1。如果不是,我在 table 中创建一个新行。时间戳允许点击计数之间有一定的延迟,以免将页面刷新计为新点击。
一切正常,但恐怕我的数据库可能超载了...
在不到 24 小时内,我在 page_hits
table.
所以我的问题是:在我的数据库中有如此快速增长的 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
指的是pages
table,client_id
指的是clients
table。您必须自己添加索引。我会去掉 date
列,并用 cookie 解决这个问题。请注意,新的 table 可以轻松扩展以包含更多信息,而不会很快变得太大。