我没有在“视图”表中存储个人页面浏览量的网站:
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。您可以提供的任何其他提示或想法将非常感激。
答案 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
行,从而增加还原性。或者,如果您愿意,如果精确度为键,您还可以对每次更新执行重新计数。
如果您的网站是读取密集型的,并且您经常需要计算每个博客帖子的观看次数(再次假设这是您的应用程序: - ),此解决方案效果很好。)