我编写php已经有一段时间了,并且掌握得很好,MySQL,好吧,我只能说我可以让它工作。
我想做一个统计脚本来跟踪其他网站的统计数据,类似于显而易见的statcounter,google analytics,mint等。
当然,我希望对此进行适当的编码,我不认为MySQL喜欢每天插入20,000,000到80,000,000次(每秒925次插入“大致**”)。
我一直在做一些研究,看起来我应该把每次访问的“条目”存储到csv或其他形式的平面文件中,然后从其中导入所需的数据。
我是不是走对了路?我只需要在正确的方向上推动,方向是一种每秒吸入1000个psuedo "MySQL“插入的方式和正确的方式。
示例插入: IP、time()、http_referer等。
我需要收集这一天的数据,然后在一天结束时,或者以特定的时间间隔,更新数据库中的一行,例如,我们获得了多少额外的唯一命中。当然,我知道如何做到这一点,只是试图给出一个可视化的东西,因为我在解释事情上很糟糕。
如果有人可以帮助我,我是一个伟大的程序员,我将非常愿意回报。
发布于 2009-04-20 05:01:41
我们在我去年工作的地方解决了这个问题,所以整个夏天。我们在信息中不需要太多的粒度,所以对我们来说非常有效的是按不同的时间段合并数据。例如,我们有一天的实时统计数据,然后将其推送到一些每日总和中,然后再推送到月表中。
这显然有一些巨大的缺点,即粒度的损失。我们当时考虑了很多不同的方法。例如,正如您所说,CSV或一些类似的格式可能用作一次处理一个月的数据的方法。然而,最大的问题是插入。
首先,根据您需要保留的信息列出一些示例模式,在这样做的过程中,您将指导自己(通过修改)找到适合您的模式。
关于大量插入的另一个注意事项:我们可能已经讨论了将实时统计数据转储到一个小守护进程中的想法,该守护进程将用于存储长达一小时的数据,然后在下一个小时结束之前将其非实时注入数据库。这只是个想法。
发布于 2009-04-20 06:06:23
对于您正在查看的活动类型,您需要从一个新的角度来看待问题:解耦。也就是说,您需要弄清楚如何解耦数据记录步骤,以便延迟和问题不会重复出现。
将命中记录到数据库表中是正确的想法,因为这可以保证有序的、非争用的访问。这是数据库提供的功能。不幸的是,这是有代价的,其中之一是数据库在返回给您之前完成了INSERT。因此,命中的记录与命中的调用相结合。记录命中的任何延迟都会减慢调用速度。
MySQL提供了一种将其解耦的方法;它称为INSERT DELAYED。实际上,您告诉数据库“插入此行,但我不能在您执行此操作时逗留”,数据库会说“好的,我收到您的行了,我会在一分钟内插入它”。可以想象,这可以减少锁定问题,因为它让MySQL中的一个线程执行插入,而不是您连接到的任何线程。不幸的是,它只适用于MyISAM表。
另一种解决方案是让一个日志记录守护进程接受您的日志记录信息,并将其列队到它必须去的任何地方。使此速度更快的诀窍是入队步骤。这就是syslogd提供的那种解决方案。
发布于 2009-04-20 06:20:03
在我看来,坚持使用MySQL来注册访问是一件好事,因为它提供了分析数据的工具。为了减少负载,我有以下建议。
这为日志记录提供了较小的性能影响,并为查询/分析提供了一个索引良好的规范化结构。
https://stackoverflow.com/questions/766924
复制相似问题