Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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/mysql/69.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 - Fatal编程技术网

通过PHP登录到文件或登录到MySQL数据库-哪个更快?

通过PHP登录到文件或登录到MySQL数据库-哪个更快?,php,mysql,Php,Mysql,我有一个数据库驱动的网站,服务大约50000页 我想跟踪每个网页/记录点击率。 我将通过创建日志来实现这一点,然后每天批处理日志一次。 我不关心如何进行批处理,只关心最快的日志记录方式 您将如何登录,您认为哪一个更快: a) 使用PHP附加到文本日志文件的末尾 b) 使用MySQL插入非索引日志表。我相信平面文件的写入速度会更快。插入文件会更快,但插入数据库会更好。使用数据库-这是唯一明智的选择。即使需要更长的时间。一旦你开始使用日志文件,那么你就进入了一个会给你带来痛苦的轨道——例如移动服务器

我有一个数据库驱动的网站,服务大约50000页

我想跟踪每个网页/记录点击率。 我将通过创建日志来实现这一点,然后每天批处理日志一次。 我不关心如何进行批处理,只关心最快的日志记录方式

您将如何登录,您认为哪一个更快:

a) 使用PHP附加到文本日志文件的末尾


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` ...