0

我有一个长时间运行的查询,我尝试通过一个无缓冲的 pdo 语句来获取它(参见下一个代码)。但是当我“执行”无缓冲查询,或者我执行“fetchAll”时,时间(另见下文)并没有太大变化......我认为无缓冲只是执行查询并给我一个光标?

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

如您所见,获取所有变量和无缓冲变量几乎没有区别。

我在这里可能做错了什么?

谢谢!

4

1 回答 1

1

您错了,因为您尝试使用无缓冲查询来加快速度。

  1. 缓冲查询将所有结果提取到 PHP 内存。
  2. 无缓冲的结果位于服务器上,直到它被获取。

每种方式都有自己的优点和缺点,但与时间的关系微弱。

阅读手动缓冲和非缓冲查询

于 2013-04-04T07:58:02.143 回答