Для теста я буду использовать mysqli. Думаю с pdo будут такие же результаты.
Использую mysql 8 и php 7.4.5
Для while и fetch_array:
$sql = "SELECT * FROM `products` LIMIT 1000000";
$result = $db->query($sql);
$time1 = microtime(true);
while ($res = $result->fetch_array()) {
echo 1;
}
$time2 = microtime(true);
$time = $time2 - $time1;
echo PHP_EOL . 'При использовании while и fetch_array время: ' . $time . PHP_EOL;
Для fetch_all и foreach:
$sql = "SELECT * FROM `products` LIMIT 1000000";
$result = $db->query($sql);
$time1 = microtime(true);
$result = $result->fetch_all();
foreach ($result as $res) {
echo 1;
}
$time2 = microtime(true);
$time = $time2 - $time1;
echo PHP_EOL . 'При использовании fetch_all время: ' . $time . PHP_EOL;
Таблица результатов
| fetch_all и foreach | fetch_array и while |
| 3.6197199821472 | 3.8901100158691 |
| 3.480633020401 | 3.9434731006622 |
| 3.3816709518433 | 3.7292020320892 |
| 9.9671909809113 | 9.7998960018158 |
| 10.335211992264 | 10.020208120346 |
Последние два теста с другой таблицей.
В первых трех тестах fetch_all и foreach побеждает с отрывом 10-20%, в последних двух — проигрывает на 3-5%.
Видимо лучше использовать fetch_all и foreach. Но можно и то и другое. fetch_array и while — не держит лишний массив в памяти.
Познавательно, спасибо за работу.