我正在使用一个将单个页面视图存储在“视图”表中的网站:
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 ;
它非常基本,存储用户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 ;
这将忽略用户信息(和引用url),并存储每天查看url的次数。这可能是我们通常希望使用数据的方式(一个页面每天被查看多少次),因此应该使查询变得非常快,但即使我主要使用它来替换“views”表(现在我想我可以按小时显示上周/月左右的页面视图,然后显示超出此范围的每日视图,因此只需要“views”表包含上周/月的数据),但它仍然是一个大表。
总之,长话短说,我想知道你是否能给我一些提示,告诉我如何最好地处理MySQL站点中统计数据/页面视图的存储,目标是使数据库中表的大小尽可能小,并且仍然能够方便地(至少相对快速地)查询信息。我看了一些分区表,但是这个站点没有安装MySQL 5.1。如果您能提供任何其他建议或想法,我们将不胜感激。