Consultas com buffer e sem buffer
As consultas usam o modo de buffer por padrão. Isso significa que os resultados da consulta são imediatamente transferidos do servidor MySQL para o PHP e então mantidos na memória do processo PHP. Isso permite operações adicionais, como contar o número de linhas e mover (buscar) o ponteiro do resultado atual. Também permite emitir consultas adicionais na mesma conexão enquanto trabalha no conjunto de resultados. A desvantagem do modo buffer é que conjuntos de resultados maiores podem exigir bastante memória. A memória será mantida ocupada até que todas as referências ao conjunto de resultados sejam desativadas ou o conjunto de resultados seja explicitamente liberado, o que acontecerá automaticamente durante o término da solicitação, o mais tardar. A terminologia "armazenar resultado" também é usada para o modo buffer, pois todo o conjunto de resultados é armazenado de uma só vez.
Note:
Ao usar a libmysqlclient como biblioteca, o limite de memória do PHP não contará a memória usada para conjuntos de resultados, a menos que os dados sejam buscados em variáveis PHP. Com o mysqlnd a memória contabilizada incluirá o conjunto completo de resultados.
Consultas MySQL sem buffer executam a consulta e aguardam que os dados do servidor MySQL sejam buscados. Isso usa menos memória do lado do PHP, mas pode aumentar a carga no servidor. A menos que o conjunto completo de resultados tenha sido obtido do servidor, nenhuma consulta adicional poderá ser enviada pela mesma conexão. Consultas sem buffer também podem ser chamadas de "resultado de uso". Depois que todas as linhas do conjunto de resultados forem buscadas, o conjunto de resultados desaparecerá e não poderá ser iterado novamente.
Seguindo essas características, consultas sem buffer devem ser utilizadas apenas quando se espera um grande conjunto de resultados que será processado sequencialmente. As consultas sem buffer contêm uma série de armadilhas que tornam mais difícil seu uso, por exemplo, o número de linhas no conjunto de resultados é desconhecido até que a última linha seja obtida. Consultas em buffer são a maneira mais fácil e flexível de processar conjuntos de resultados.
Como as consultas em buffer são o padrão, os exemplos abaixo demonstrarão como executar consultas sem buffer com cada API.
Example #1 Exemplo de consulta sem buffer: mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$unbufferedResult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>
Example #2 Exemplo de consulta sem buffer: pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_password');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>