Для теста я буду использовать 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 — не держит лишний массив в памяти.
Познавательно, спасибо за работу.