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.
Nota:
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.
Exemplo #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;
}
?>
Exemplo #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;
}
?>