Основные понятия
PHP Manual

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

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

Замечание:

При использовании libmysqlclient как библиотеки, ограничение памяти PHP (ini: memory_limit) не будет учитывать память используемую для результирующих наборов до тех пор пока данные не будут переданы в переменные PHP. С mysqlnd учёт пямяти так же будет включать в себя размер результирующего набора.

Небуферизированные MySQL заросы выполняются и возвращают resource пока данные ожидают получения на MySQL сервере. Это расходует меньше памяти на стороне PHP, но может увеличить нагрузку на сервер. Пока полный рузультирующий набор не будет передан с сервера, следующий запрос не сможет быть отправлен через это же соединение. Небуферизированные запросы так же могут быть отложены как "use result".

Следующие характеристики буферизированных запросов должны быть использованы в случаях, когда вы ожидаете только ограниченный результирующий набор или хотите знать количесво возвращаемых строк до прочтения всех строк. Небуферизированный режим должен быть использован если вы ожидаете большие размеры результирующих наборов.

Поскольку буферизированные запросы применяются по умолчанию, следующие примеры продемонстрируют как выполнить небуферизированные запросы в каждом из API

Пример #1 Пример небуферизированного запроса: mysqli

<?php
$mysqli  
= new mysqli("localhost""my_user""my_password""world");
$uresult $mysqli->query("SELECT Name FROM City"MYSQLI_USE_RESULT);

if (
$uresult) {
   while (
$row $uresult->fetch_assoc()) {
       echo 
$row['Name'] . PHP_EOL;
   }
}
$uresult->close();
?>

Пример #2 Пример небуферизированного запроса: pdo_mysql

<?php
$pdo 
= new PDO("mysql:host=localhost;dbname=world"'my_user''my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERYfalse);

$uresult $pdo->query("SELECT Name FROM City");
if (
$uresult) {
   while (
$row $uresult->fetch(PDO::FETCH_ASSOC)) {
       echo 
$row['Name'] . PHP_EOL;
   }
}
?>

Пример #3 Пример небуферизированного запроса: mysql

<?php
$conn 
mysql_connect("localhost""my_user""my_pass");
$db   mysql_select_db("world");

$uresult mysql_unbuffered_query("SELECT Name FROM City");
if (
$uresult) {
   while (
$row mysql_fetch_assoc($uresult)) {
       echo 
$row['Name'] . PHP_EOL;
   }
}
?>

Основные понятия
PHP Manual