Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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 Zend_Db和无缓冲查询_Php_Mysql_Pdo_Unbuffered Queries - Fatal编程技术网

Php Zend_Db和无缓冲查询

Php Zend_Db和无缓冲查询,php,mysql,pdo,unbuffered-queries,Php,Mysql,Pdo,Unbuffered Queries,我有一个长时间运行的查询,我试图通过一个无缓冲的pdo语句获取它(请参阅下面的代码)。 但是,当我“执行”无缓冲查询,或者我执行“fetchAll”时,计时(也请参见下面的内容)实际上没有太大变化。。。 我认为unbuffered只是执行查询并给我一个游标 get_db函数返回一个Zend_db对象 l('Start 1'); $sql = get_db('ATO')->select() ... Big query...

我有一个长时间运行的查询,我试图通过一个无缓冲的pdo语句获取它(请参阅下面的代码)。 但是,当我“执行”无缓冲查询,或者我执行“fetchAll”时,计时(也请参见下面的内容)实际上没有太大变化。。。 我认为unbuffered只是执行查询并给我一个游标

get_db函数返回一个Zend_db对象

  l('Start 1');

  $sql = get_db('ATO')->select()
                       ... Big query...
                       ->assemble();

  l('Assembled');

  get_db('APNS')->query($sql)->fetchAll();

  l('All fetched... Going again!');

  $PDOStatement = get_db('ATO')->getConnection()
                                ->prepare($sql,
                          array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false));

  l('prepared');

  if ( $PDOStatement->execute() === false ) {
    l(':(');
    exit(1);
  }

  l('fetching');

  while ( ($PDOrow = $PDOStatement->fetch()) !== false ) {
  }

  l ('all done');

  function l($t) {
    static $start = null;
    if ( $start === null ) {
      $start = microtime(true);
    }
    echo sprintf("[%0.5f] %s\n", microtime(true) - $start, $t);
  }
以及时间安排:

[0.00000] Start 1
[0.02262] Assembled
[214.69091] All fetched... Going again!
[214.69105] prepared
[417.01584] fetching
[420.55217] all done
正如您所看到的,获取all和未缓冲变量几乎没有区别

我可能做错了什么


谢谢

您错了,因为您试图使用无缓冲查询来加速

  • 缓冲查询将所有结果提取到PHP内存
  • 未缓冲的结果在服务器上,直到它被获取为止
  • 每种方法都有各自的优缺点,但与时间的关系很弱


    阅读手册

    事实上,在这种情况下,它与时间密切相关。当数据被提取到PHP中时,它会占用大量内存。如果我将其保留在服务器上,则不会立即获取数据,因此不需要分配额外的内存。-这使得这个脚本的速度提高了大约50秒@StevenVanIngelgem,我写了“与时间的弱关联”。我觉得你找错地方了。尝试在mysql客户端中执行sql以测量时间。哦,记住。。。准备好的声明也会浪费一些时间。。。但不要将它的信息用于优化。@Stevenvaninglegem,“这导致了该脚本速度提高了约50秒!”因此请使用新的测量更新您的帖子。帖子于2012-07-03完成。。。我们又快一年了:)。我再也无法访问该代码了,伙计;)