【问题标题】:Zend_Db and unbuffered queriesZend_Db 和无缓冲查询
【发布时间】:2012-07-03 23:02:42
【问题描述】:

我有一个长时间运行的查询,我尝试通过无缓冲的 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

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

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

谢谢!

【问题讨论】:

    标签: php mysql pdo unbuffered-queries


    【解决方案1】:

    你错了,因为你试图使用无缓冲的查询来加快速度。

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

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

    阅读手册Buffered and Unbuffered queries

    【讨论】:

    • 在这种情况下实际上与时间密切相关。当数据被提取到 PHP 中时,它会使用大量内存。如果我将它保存在服务器上,则不会立即获取数据,因此不需要分配额外的内存。 - 这导致该脚本的速度提高了大约 50 秒!
    • @StevenVanIngelgem,我写了“与时间弱相关”。我认为你在错误的地方寻找优化。尝试在 mysql 客户端中执行你的 sql 来测量时间。哦,请记住...准备好的语句也浪费了一些时间...但是不要将其信息用于优化。
    • @StevenVanIngelgem,“这导致该脚本的速度提高了大约 50 秒!”所以用新的衡量标准更新你的帖子。
    • 帖子于 2012 年 7 月 3 日完成...我们又将近一年了 :)。我无法再访问该代码了;)
    猜你喜欢
    • 2016-12-23
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多