通过PHP登录到文件或登录到MySQL数据库-哪个更快?
我有一个数据库驱动的网站,服务大约50000页 我想跟踪每个网页/记录点击率。 我将通过创建日志来实现这一点,然后每天批处理日志一次。 我不关心如何进行批处理,只关心最快的日志记录方式 您将如何登录,您认为哪一个更快: a) 使用PHP附加到文本日志文件的末尾通过PHP登录到文件或登录到MySQL数据库-哪个更快?,php,mysql,Php,Mysql,我有一个数据库驱动的网站,服务大约50000页 我想跟踪每个网页/记录点击率。 我将通过创建日志来实现这一点,然后每天批处理日志一次。 我不关心如何进行批处理,只关心最快的日志记录方式 您将如何登录,您认为哪一个更快: a) 使用PHP附加到文本日志文件的末尾 b) 使用MySQL插入非索引日志表。我相信平面文件的写入速度会更快。插入文件会更快,但插入数据库会更好。使用数据库-这是唯一明智的选择。即使需要更长的时间。一旦你开始使用日志文件,那么你就进入了一个会给你带来痛苦的轨道——例如移动服务器
b) 使用MySQL插入非索引日志表。我相信平面文件的写入速度会更快。插入文件会更快,但插入数据库会更好。使用数据库-这是唯一明智的选择。即使需要更长的时间。一旦你开始使用日志文件,那么你就进入了一个会给你带来痛苦的轨道——例如移动服务器、文件权限、妨碍负载平衡等 如果您已经打开了数据库,那么我认为插入一行可能会更快 然而,对于所有这些与性能相关的问题,唯一可以确定的方法是编写一个简单的测试并对其进行测量 更新:我已经做了一个快速测试-如果您必须打开和关闭文件,使用10000行的测试,速度大约相同或更慢: 但是,当您开始有多个进程执行此操作时,速度会减慢,如下所示。这是10个并发进程(所有计时以秒为单位)
DB时间:2.1695
分贝时间:2.3869
分贝时间:2.4305
数据库时间:2.5864
分贝时间:2.7465
数据库时间:3.0182
数据库时间:3.1451
数据库时间:3.3298
分贝时间:3.4483
分贝时间:3.7812
文件打开时间:0.1538
文件打开时间:0.5478
文件打开时间:0.7252
文件打开时间:3.0453
文件打开时间:4.2661
文件打开时间:4.4247
文件打开时间:4.5484
文件打开时间:4.6319
文件打开时间:4.6501
文件打开时间:4.6646
打开关闭文件时间:11.3647
打开关闭文件时间:12.2849
打开关闭文件时间:18.4093
打开关闭文件时间:18.4202
打开关闭文件时间:21.2621
打开关闭文件时间:22.7267
打开关闭文件时间:23.4597
打开关闭文件时间:25.6293
打开关闭文件时间:26.1119
打开关闭文件时间:29.1471
函数调试($d)
{
静态$start\u time=NULL;
静态$start\代码\行=0;
如果($start\u time===NULL)
{
$start_time=time()+microtime();
$start\u code\u line=$code\u line;
返回0;
}
printf($d time:%.4f\n),(time()+microtime()-$start_time));
$fp=@fopen('dbg.txt','a');
fprintf($fp,$d时间:%.4f\n),(time()+microtime()-$start_time));
fclose($fp);
$start_time=time()+microtime();
$start\u code\u line=$code\u line;
}
函数tfile()
{
$fp=@fopen('t1.txt','a');
对于($i=0;$i),我建议您使用几个测试用例来测试这两个
我假设一个平面文件会更快,b/c数据库就是这么做的——它只是将其写入一个文件。我能想到的唯一好处是,如果数据库可以并发运行,您可能会得到更好的结果。我会使用延迟插入MySQL。这样,您就不必等待插入完成。一切取决于s取决于您的基础结构和限制。如果磁盘速度慢,写入速度就会慢。如果SQL server被请求延迟,插入速度就会慢。平面文件可能是最好的方式,但我会编写代码或使用现有代码(PEAR::Log)因此,您可以随意更改提供程序和存储方法。您可以使用这两种方法进行尝试,它支持:
- 通过xml和属性文件进行配置(与log4j的结构相同)
- 文件、RollingFile、DailyFile、Echo、控制台、邮件、PEAR::Db、PHP错误、Syslog或NT事件以及套接字附加器
- 简单、TTCC、模式、Html和Xml布局
- 嵌套(NDC)和映射(MDC)诊断上下文
- 可切换的内部调试
关于登录到文件,您可以通过缓冲写请求来提高性能
写入文件。旋转日志
将文件批量加载到数据库
在预定的基础上
选择这种体系结构有很多原因——易于扩展(写入许多日志,将它们加载到数据库中),不依赖数据库中的SPOF(如果出现问题,只需积累一段时间的日志),能够在加载时进行清理和非平凡的解析,而不会给生产服务器带来负担,等等。一些注意事项:
您认为您会想将日志数据与数据库中的其他数据连接起来吗?如果是这样,那么db插入的开销可能是合理的,这样就可以轻松利用现有的关系
将数据记录到数据库中是否可以大大减少记录的数据量(由于数据库中存在的关系)?例如,用户活动数据库中的日志可能只是一个包含userid、activityid和时间戳的表。文件中的日志文件不是人类可读的。根据您的需要,您需要在日志文件中捕获至少一些用户数据,以确保其本身是有用的和人类可读的
您有没有可能希望在前端或通过管理工具利用此日志数据?如果有,最好使用DB write
正如其他人提到的,这取决于很多因素,如流量、磁盘速度等。您必须测试这两种情况
在测试MySQL时,请同时尝试MyISAM和INNODB。理论上,INNODB的性能会更好,因为它有行级锁定。我也做了类似的事情。我将每个记录记录记录到一个单独的文件中,然后我有一个批处理过程来获取文件,将它们放入tar文件并将它们上载到中央日志服务器(在我的例子中,S3:)
我为每个日志条目生成随机文件名。我这样做是为了避免锁定文件进行轮换。通过这种方式存档/删除文件非常容易
我使用json作为日志格式,而不是典型的以空格分隔的日志文件
DB time: 2.1695
DB time: 2.3869
DB time: 2.4305
DB time: 2.5864
DB time: 2.7465
DB time: 3.0182
DB time: 3.1451
DB time: 3.3298
DB time: 3.4483
DB time: 3.7812
File open time: 0.1538
File open time: 0.5478
File open time: 0.7252
File open time: 3.0453
File open time: 4.2661
File open time: 4.4247
File open time: 4.5484
File open time: 4.6319
File open time: 4.6501
File open time: 4.6646
Open close file time: 11.3647
Open close file time: 12.2849
Open close file time: 18.4093
Open close file time: 18.4202
Open close file time: 21.2621
Open close file time: 22.7267
Open close file time: 23.4597
Open close file time: 25.6293
Open close file time: 26.1119
Open close file time: 29.1471
function debug($d)
{
static $start_time = NULL;
static $start_code_line = 0;
if( $start_time === NULL )
{
$start_time = time() + microtime();
$start_code_line = $code_line;
return 0;
}
printf("$d time: %.4f\n", (time() + microtime() - $start_time));
$fp = @fopen('dbg.txt','a');
fprintf($fp,"$d time: %.4f\n", (time() + microtime() - $start_time));
fclose($fp);
$start_time = time() + microtime();
$start_code_line = $code_line;
}
function tfile()
{
$fp = @fopen('t1.txt','a');
for ($i=0;$i<10000;$i++)
{
$txt = $i."How would you log, which do you think is quicker:How would you log, which do you think is quicker:";
fwrite($fp,$txt);
}
fclose($fp);
}
function tfile_openclose()
{
for ($i=0;$i<10000;$i++)
{
$fp = @fopen('t1.txt','a');
$txt = $i."How would you log, which do you think is quicker:How would you log, which do you think is quicker:";
fwrite($fp,$txt);
fclose($fp);
}
}
function tdb()
{
$db = mysql_connect('localhost','tremweb','zzxxcc');
$select_db = mysql_select_db('scratch');
if (!$select_db)
die('Error selecting database.');
for ($i=0;$i<10000;$i++)
{
$txt = $i."How would you log, which do you think is quicker:How would you log, which do you think is quicker:";
mysql_query("INSERT INTO tlog values('".$txt."')");
}
}
debug("");
tfile();
debug("File open");
tfile_openclose();
debug("Open close file");
tdb();
debug("DB");
INSERT DELAYED INTO `hits` ...