如何为流量分析系统构建合适的数据库?

时间:2011-12-20 12:45:12

标签: php mysql

如何为分析服务构建适当的结构?目前我有一个表存储有关每个用户访问该页面的用户ID的数据,所以稍后我的客户将能够查看特定日期的统计数据。

我今天想了一下,我想知道:假设我有1000个用户,每个人每天在他们的网站上有大约1,000次展示,这意味着我每天会在一张桌子上获得1,000,000(1M)条新记录。大约2个月左右(表格达到6000万条记录)后如何运作?

我只是认为经过一段时间后会有如此多的记录,以至于提取数据的PHP查询会非常繁重,速度慢并占用大量资源,这是真的吗?以及如何防止这种情况?

我的一位朋友在做类似的事情,他会为每个客户制作一张新桌子,这是正确的方法吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

您面临的问题是I / O绑定系统。每天100万条记录大约每秒12次写入查询。这是可以实现的,但在同时写入时拉出数据将使您的系统受到硬盘级别的限制。

您需要做的是配置数据库以支持您将要执行的I / O卷,例如 - 使用适当的数据库引擎(InnoDB而不是MyISAM),确保您拥有足够快的HDD子系统(RAID,不是常规驱动器,因为它们可以并且在某些时候会失败),以最佳方式设计数据库,使用EXPLAIN检查查询以查看它们可能出错的位置,甚至可能使用不同的存储引擎 - 我个人而言如果我是你,请使用TokuDB

而且,我真诚地希望您在数据库方面进行查询,排序和过滤,而不是在PHP方面。

答案 1 :(得分:1)

Consider this Link to the Google Analytics Platform Components Overview page并特别注意数据写入数据库的方式,只需基于整个系统的体系结构。

不是立即将所有内容写入数据库,而是将所有内容写入日志文件,然后稍后处理日志(可能是在流量不是很高的时候)。在一天结束时,您仍然需要将所有这些写入数据库,但如果您将它们一起批处理并在更容忍这种负载时执行它们,那么您的系统将扩展得更好。

答案 2 :(得分:-1)

您可以将展示次数标准化为这样的数据;

Client Table
{
  ID
  Name
}


Pages Table
{
  ID
  Page_Name
}

PagesClientsVisits Table
{
  ID
  Client_ID
  Page_ID
  Visits
}

只需在每次新展示的最终表格上增加访问次数。然后,那里的最大记录数(客户数*页数)

答案 3 :(得分:-1)

拥有一张包含6000万条记录的表格可以。这就是数据库的用途。但是你应该注意表中有多少个字段。还有每个字段的数据类型(=>大小)。

您可以创建某种数据报告。考虑一下这些报告真正需要哪些数据。例如,您可能只需要每个页面上每个用户的访问次数。一个简单的计数就可以了。

您还可以做的是每晚生成报告,然后删除原始数据。

所以,请阅读并考虑一下。