PDO:: fetchAll по сравнению с PDO:: выборка в цикле

Просто быстрый вопрос.

Есть ли любое различие в производительности между использованием PDO:: fetchAll () и PDO:: выборка () в цикле (для больших наборов результатов)?

Я являюсь выбирающим в объекты пользовательского класса, если это имеет какое-либо значение.

Мое начальное необразованное предположение было то, что fetchAll мог бы быть быстрее, потому что PDO может выполнить несколько операций в одном операторе, в то время как mysql_query может только выполнить тот. Однако у меня есть мало знания внутренних работ PDO, и в документации ничто не говорится об этом, и является ли fetchAll () просто циклом PHP-стороны, выведенным в массив.

Какая-либо справка?

69
задан Lotus Notes 5 May 2010 в 04:31
поделиться

3 ответа

Небольшой тест с 200к случайных записей. Как и ожидалось, метод fetchAll работает быстрее, но требует больше памяти.

Result :
fetchAll : 0.35965991020203s, 100249408b
fetch : 0.39197015762329s, 440b

Используемый тестовый код:

<?php
// First benchmark : speed
$dbh = new PDO('mysql:dbname=testage;dbhost=localhost', 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT * FROM test_table WHERE 1';
$stmt = $dbh->query($sql);
$data = array();
$start_all = microtime(true);
$data = $stmt->fetchAll();
$end_all = microtime(true);

$stmt = $dbh->query($sql);
$data = array();
$start_one = microtime(true);
while($data = $stmt->fetch()){}
$end_one = microtime(true);

// Second benchmark : memory usage
$stmt = $dbh->query($sql);
$data = array();
$memory_start_all = memory_get_usage();
$data = $stmt->fetchAll();
$memory_end_all = memory_get_usage();

$stmt = $dbh->query($sql);
$data = array();
$memory_end_one = 0;
$memory_start_one = memory_get_usage();
while($data = $stmt->fetch()){
  $memory_end_one = max($memory_end_one, memory_get_usage());
}

echo 'Result : <br/>
fetchAll : ' . ($end_all - $start_all) . 's, ' . ($memory_end_all - $memory_start_all) . 'b<br/>
fetch : ' . ($end_one - $start_one) . 's, ' . ($memory_end_one - $memory_start_one) . 'b<br/>';
75
ответ дан 24 November 2019 в 13:51
поделиться

Одна вещь о PHP, которая, как я обнаружил, верна почти всегда , заключается в том, что функция, которую вы реализуете самостоятельно, почти всегда будет медленнее чем эквивалент PHP. Это связано с тем, что когда что-то реализовано в PHP, у него нет всех оптимизаций времени компиляции, которые есть в C (на котором написан PHP), и возникают большие накладные расходы на вызовы функций PHP.

10
ответ дан 24 November 2019 в 13:51
поделиться

@Arkh

// $data in this case is an array of rows;

$data = $stmt->fetchAll();


// $data in this case is just one row after each loop;

while($data = $stmt->fetch()){}


// Try using

$i = 0;

while($data[$i++] = $stmt->fetch()){}

Разница в памяти должна стать незначительной

9
ответ дан 24 November 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: