Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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_Database - Fatal编程技术网

PHP/MYSQL-将其推向极限?

PHP/MYSQL-将其推向极限?,php,mysql,database,Php,Mysql,Database,我编写php已经有一段时间了,并且对它有着相当坚定的掌握,MySQL,好吧,让我们说我可以让它工作 我想制作一个统计脚本来跟踪其他网站的统计数据,类似于显而易见的statcounter、google analytics、mint等 一、 当然,我希望正确地编写代码,我不认为MySQL喜欢每天20000000到80000000次插入(大约每秒925次插入**) 我一直在做一些研究,看起来我应该将每次访问“条目”存储到csv或其他形式的平面文件中,然后从中导入我需要的数据 我走对了吗?我只需要朝着正

我编写php已经有一段时间了,并且对它有着相当坚定的掌握,MySQL,好吧,让我们说我可以让它工作

我想制作一个统计脚本来跟踪其他网站的统计数据,类似于显而易见的statcounter、google analytics、mint等

一、 当然,我希望正确地编写代码,我不认为MySQL喜欢每天20000000到80000000次插入(大约每秒925次插入**)

我一直在做一些研究,看起来我应该将每次访问“条目”存储到csv或其他形式的平面文件中,然后从中导入我需要的数据

我走对了吗?我只需要朝着正确的方向推动,这个方向是每秒吸入1000个psuedo“MySQL”插入的方式,也是正确的方式

插入示例:IP、time()、http\u referer等

我需要收集当天的数据,然后在一天结束时,或者在一定的时间间隔内,更新数据库中的一行,例如,我们获得了多少额外的独特点击。当然,我知道怎么做,只是想给人一个形象化的印象,因为我很难解释事情


如果有人能帮我的话,我是一名出色的程序员,我会非常乐意回报你的帮助。

我们在去年夏天我一直工作的地方解决了这个问题。我们不需要太多的信息粒度,所以对我们来说非常有效的方法是按不同的时间段合并数据。例如,我们会有一天的实时统计数据,之后它会被推到每天的总和中,然后被推到每月的表格中

这显然有一些巨大的缺点,即粒度损失。当时我们考虑了很多不同的方法。例如,正如您所说,CSV或类似的格式可以作为一种一次处理一个月数据的方式。然而,最大的问题是插入

首先,根据您需要保留的确切信息,列出一些示例模式,在这样做的过程中,您将引导自己(通过修订)了解哪些内容适合您


大量插入的另一个注意事项是:我们可能已经讨论过将实时统计数据转储到一个小守护进程中的想法,该守护进程将用于存储多达一个小时的数据,然后在下一个小时结束之前将其非实时地注入到数据库中。只是想一想。

假设您的MySQL服务器与web服务器位于不同的物理机器上,那么是的,将命中记录到本地文件系统上的一个文件,然后定期将其推送到数据库可能会更有效


不过,这会增加一些复杂性。您是否测试过或考虑过使用常规查询进行测试?也就是说,使用更新查询增加计数器(因为您不需要在单独的行中使用每个条目)。你可能会发现,这并没有像你想象的那么慢,尽管很明显,如果你每天要浏览8000000次页面,你可能根本没有多少回旋的余地。

我认为使用MySQL收集日志和汇总日志的任务是一种过火的行为。在你的情况下,我会坚持使用普通日志文件。它没有提供关系数据库管理的全部功能,但足以生成摘要。在现代操作系统上,一个简单的锁定-追加-解锁文件操作是无缝和即时的。相反,将MySQL用于相同的简单操作会加载CPU,并可能导致交换和其他地狱般的可伸缩性


也要注意储存。使用纯文本文件,您将能够存储高负载网站多年的日志,同时考虑到当前硬盘的价格/容量比和纯文本日志的可压缩性。对于您正在查看的活动类型,您需要从一个新的角度来看待这个问题:解耦。也就是说,您需要弄清楚如何将数据记录步骤解耦,以便延迟和问题不会扩散到后端

在将点击记录到数据库表中时,您的想法是正确的,因为这样可以保证有序、无争用的访问。这是数据库提供的。不幸的是,这是有代价的,其中之一是数据库在返回给您之前完成
插入。因此,hit的记录与hit的调用是耦合的。记录命中的任何延迟都会减慢调用

MySQL提供了一种解耦的方法;它被称为
INSERT DELAYED
。实际上,你告诉数据库“插入这一行,但你这样做的时候我不能呆在这里”,数据库说“好的,我得到了你的行,我有时间就插入它”。可以想象,这减少了锁定问题,因为它允许MySQL中的一个线程进行插入,而不是连接到哪个线程。不幸的是,它只适用于MyISAM表


另一个解决方案是更通用的解决方案,它是一个日志守护进程,它接受您的日志信息,并将其排入队列,以便将其发送到任何需要的地方。提高速度的诀窍是排队步骤。这是syslogd将提供的解决方案。

如果您明智地做一些事情,您应该能够非常容易地获得这种容量。这里有一些想法

  • 您将需要定期(每小时、每天?)对审计表进行分区,如果没有其他事情的话,这样您就可以删除旧分区以合理地管理空间。删除10M行并不酷
  • 您的web服务器(因为您将运行一个相当大的服务器场,对吗?)可能希望以异步方式进行大批量插入。您将拥有一个守护进程,该进程读取每台web服务器机器上的平面文件日志,并对它们进行批处理。这对于InnoDB性能和避免审核降低web服务器的速度非常重要。此外,如果您的数据库不可用,您的web服务器需要继续为web请求提供服务,并且仍然需要对它们进行审核(最终)