Прочитав несколько статей о влиянии производительности функции PDO fetchall()
PHP, мне любопытно, есть ли другой способ добиться того же результата, не вызывая fetchall()
.
Чтобы объяснить, большинство согласны с тем, что fetchall()
имеет тенденцию быть ресурсоемкой. В моем случае я не считаю, что это будет слишком большой проблемой. Да, мне нужно вытащить целую таблицу из моей базы данных и отобразить ее пользователю, но она будет составлять около 100 строк; Я не верю, что это будет проблемой. Гипотетически, однако, если мне нужно было вытащить 100 000 строк, что было бы более оптимальным решением?
Гипотетически, если вам нужно вывести все 100 000 строк в одном ответе, вы должны установить PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
на false
, выполнить запрос и PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
набор PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
по одной строке за раз с помощью выборки . Чтобы уточнить, php буферизует весь набор результатов независимо от того, вызывается ли fetchAll (), если для PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
установлено значение true.
Преимущество заключается в том, что вы резко сокращаете максимальное потребление памяти сценария, и вы получаете возможность запуска потокового вывода раньше, хотя общее время завершения может длиться или не быть больше.
Я игнорирую другие вещи, которые вы должны учитывать в таких экстремальных обстоятельствах, как буферизация вывода и т. Д. …
Альтернативой является выбор одной строки за другой внутри цикла, например:
while( $row = $statement->fetch() ){ // so something with $row }
Очевидно, что если вам нужны все строки, например, для вычисления с ними некоторой статистики, то приведенное выше не работает. Однако во многих случаях SQL предоставляет решения, позволяющие рассчитывать такую статистику «на лету» и возвращать только результат.