我在我的网站上建立了一个简单的点击计数器(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行。
所以我的问题是:在我的数据库中拥有如此快速增长的表有什么风险? (性能问题?超出数据库大小限制?)
答案 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解决这个问题。请注意,可以轻松扩展新表以包含更多信息,而不会太快。