在MySQL中存储视图/统计信息的最佳方法

时间:2010-11-15 18:05:21

标签: php mysql views archive statistics

我没有在“视图”表中存储个人页面浏览量的网站:

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 ;

这会忽略用户信息(和引荐网址),并存储每天查看网址的次数。这可能是我们通常想要使用数据的方式(每天查看一次页面的次数)所以应该快速查询,但即使我用它来主要替换'views'表(右)现在我想我可以按小时显示上周/月左右的页面浏览量,然后显示超出该数据的每日视图,因此只需要'views'表来包含上周/月的数据)但它仍然很大表

无论如何,长话短说,我想知道你是否可以给我任何关于如何在MySQL网站中最好地处理统计数据/页面视图存储的提示,目标是保持表的大小(s )尽可能小地在数据库中,仍然能够轻松(并且至少相对快速地)查询信息。我看了一下分区表,但该站点没有安装MySQL 5.1。您可以提供的任何其他提示或想法将非常感激。

3 个答案:

答案 0 :(得分:1)

MySQL的归档存储引擎

http://dev.mysql.com/tech-resources/articles/storage-engine.html

对于日志来说非常棒,它写得很快,一个缺点就是读取速度有点慢。但它对于日志表很有用。

答案 1 :(得分:1)

您可能希望只为页面创建一个表,并让用户视图具有对该表的引用。另一种可能的优化是将用户IP存储在不同的表中,可能是某些会话表信息。这应该会减少您的查询时间。你在归档表的正确轨道上;同样的优化也应该有所帮助。

答案 2 :(得分:1)

假设您的应用程序是博客,并且您希望跟踪博客帖子的视图,那么您可能会有一个名为blog_posts的表。在此表中,我建议您创建一个名为“views”的列,在此列中,您将存储此帖子所拥有的视图的静态值。您仍将使用views表,但这仅用于跟踪所有视图(并检查它们是否“唯一”)。

基本上,当用户访问博客帖子时,它会检查views表以查看是否应该添加。如果是这样,它还会增加blog_posts中博客帖子的相应行中的“views”字段。这样,您可以参考每个帖子的“views”字段,快速查看它有多少视图。您可以更进一步,通过设置CRON作业来重新计算并验证所有视图并在一天结束时相应地更新每个blog_posts行,从而增加还原性。或者,如果您愿意,如果精确度为,您还可以对每次更新执行重新计数。

如果您的网站是读取密集型的,并且您经常需要计算每个博客帖子的观看次数(再次假设这是您的应用程序: - ),此解决方案效果很好。)