Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQL中存储视图/统计信息的最佳方法_Php_Mysql_Views_Archive_Statistics - Fatal编程技术网

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

Php 在MySQL中存储视图/统计信息的最佳方法,php,mysql,views,archive,statistics,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_

我在一个网站上工作,该网站在“视图”表中存储单个页面视图:

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\u 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”表(现在我想我可以按小时显示上周/月左右的页面浏览量,然后再显示超出该时间的每日浏览量,因此只需要“视图”表来包含上周/月的数据)但它仍然是一个大表


总之,长话短说,我想知道你是否能给我一些建议,告诉我如何最好地处理MySQL站点中统计/页面视图的存储,目标是使数据库中的表的大小尽可能小,并且仍然能够轻松地(至少相对快速地)存储查询信息。我看过一些分区表,但该站点没有安装MySQL 5.1。如果您能提供任何其他提示或想法,我们将不胜感激。

MySQL的归档存储引擎


它对日志很好,写起来很快,一个缺点是读取速度有点慢。但对日志表来说很好。

您可能希望有一个只用于页面的表,并且让用户视图有一个对该表的引用。另一个可能的优化是将用户IP存储在不同的表中,可能是某个会话选项卡这将在一定程度上减少您的查询时间。您使用存档表的方法是正确的;同样的优化也会有帮助。

假设您的应用程序是一个博客,并且您希望跟踪博客文章的视图,您可能会有一个名为
blog\u posts
的表t您创建一个名为“视图”的列,在此列中,您将存储此帖子有多少视图的静态值。您仍将使用
视图
表,但该表仅用于跟踪所有视图(并检查它们是否“唯一”)

基本上,当用户访问一篇博客文章时,它会检查
视图
表以查看是否应该添加它。如果是这样,它还会在
博客文章
的相应行中增加“视图”字段。这样,您就可以只参考“视图”字段,以便快速查看每篇文章的浏览量。您可以更进一步,通过设置CRON作业来重新统计和验证所有视图,并在一天结束时相应地更新每篇
blog\u文章
行,从而添加冗余。或者,如果您愿意,您还可以对每次更新执行重新计数,前提是准确性达到second是关键


如果您的站点是阅读密集型站点,并且您经常需要计算每个博客文章的浏览量(同样,假设是您的应用程序:-),那么此解决方案效果良好。

嗯,您的服务器难道没有保存所有这些数据的访问日志吗?有很多日志查看器/摘要器用于web访问日志。有没有令人信服的理由不使用其中一个?view_created专栏的目的是什么?如果我想每小时显示一次视图(比如说今天一篇文章每小时浏览多少次),可以使用view_created专栏的目的MicWafflestix。我想我可以使用DATETIME而不是INT(10)时间戳,但我不确定这对我有多大帮助。然后我可能还会将view_date和view_created(这里有点混乱的术语)合并到一个DATETIME列中。原生类型在SQL中总是一个好主意。前几天我稍微看了一下。看起来很有趣,但在我当前的MySQL安装中不支持(通过ShowEngines;query检查)。我会让主持人把它打开,或者随便什么,然后玩一玩。谢谢你的提示。我喜欢这个主意。看起来像是对数据结构进行了一些非常基本、可靠的优化(而不是升级mysql或使用nosql表或其他我担心必须进行的重大更改)。我还发现了MySQL中的INET_ATON()函数,它可以帮助我减少存储IP地址的大小(可以使用INT而不是VARCHAR)。总之,就短期而言,我认为你提到的解决方案将对解决我的问题大有帮助。谢谢。@Charlie:不客气。在大范围内,小小的优化确实开始产生巨大的影响;同时,一些非常复杂的优化并没有带来通常预期的回报。我发现,首先进行简单、直接的优化通常能让我在90%的时间内找到一个好的解决方案,如果不是一直都是这样的话。