【发布时间】:2011-05-10 09:38:51
【问题描述】:
我没有在“视图”表中存储单个页面视图的网站:
CREATE TABLE `views` (
`view_id` bigint(16) NOT NULL auto_increment,
`user_id` int(10) NOT NULL,
`user_ip` varchar(15) NOT NULL,
`view_url` varchar(255) NOT NULL,
`view_referrer` varchar(255) NOT NULL,
`view_date` date NOT NULL,
`view_created` int(10) NOT NULL,
PRIMARY KEY (`view_id`),
KEY `view_url` (`view_url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
这是非常基本的,存储 user_id(用户在网站上的 id)、他们的 IP 地址、url(没有域以稍微减小表的大小)、推荐 url(现在并没有真正使用它)可能会去掉它)、日期(当然是 YYYY-MM-DD 格式)和视图发生时的 unix 时间戳。
当然,该表变得相当大(目前有 400 万行,而且它是一个相当年轻的网站)并且在其上运行查询很慢。
为了一些基本的优化,我现在创建了一个“views_archive”表:
CREATE TABLE `views_archive` (
`archive_id` bigint(16) NOT NULL auto_increment,
`view_url` varchar(255) NOT NULL,
`view_count` smallint(5) NOT NULL,
`view_date` date NOT NULL,
PRIMARY KEY (`archive_id`),
KEY `view_url` (`view_url`),
KEY `view_date` (`view_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
这将忽略用户信息(和推荐网址)并存储每天查看网址的次数。这可能是我们通常希望使用数据的方式(每天查看页面的次数),因此应该使查询非常快,但即使我主要使用它来替换“视图”表(对现在我想我可以按小时显示上周/月左右的页面浏览量,然后显示除此之外的每日浏览量,因此只需要“浏览量”表来包含上周/月的数据)但它仍然很大表。
总之,长话短说,我想知道您是否可以给我一些关于如何最好地处理 MySQL 站点中的统计信息/页面视图存储的提示,目标是保持表的大小(s ) 在数据库中尽可能小,并且仍然能够轻松(并且至少相对快速)查询信息。我看过一些分区表,但该站点没有安装 MySQL 5.1。您可以提供的任何其他提示或想法将不胜感激。
【问题讨论】:
-
嗯,你的服务器不是有一个已经保存所有这些数据的访问日志吗?有很多用于 Web 访问日志的日志查看器/摘要器。是否有令人信服的理由不使用其中之一?
-
view_created 列的用途是什么?
-
view_created 列 MicWafflestix 的用途是如果我想每小时显示浏览量(比如今天每小时查看一篇文章的次数)。我想我可以使用 DATETIME 代替 INT(10) 时间戳,但我不确定这对我有多大帮助。
-
那么我可能还会将 view_date 和 view_created(那里的命名法有些混乱)合并到一个 DATETIME 列中。原生类型在 SQL 中总是一个好主意。
标签: php mysql views archive statistics