Zend_Db и небуферизованные запросы

У меня длинный запрос, который я пытаюсь получить с помощью небуферизованного оператора 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

Как вы можете видеть, почти нет разницы в получении всех и небуферизованного варианта.

Что я могу здесь делать не так?

Спасибо!

1 ответ

Вы не правы, потому что вы пытаетесь использовать небуферизованные запросы для ускорения.

  1. Буферизованные запросы извлекают все результаты в память PHP.
  2. С небуферизованным результатом лежит на сервере, пока не будет получен.

Каждый способ имеет свои преимущества и недостатки, но он слабо связан со временем.

Читать руководство Буферизованные и небуферизованные запросы

Другие вопросы по тегам