Consultas con o sin almacenamiento en memoria
Las consultas utilizan por omisión el modo de almacenamiento en memoria.
Esto significa que el resultado de las consultas se transfiere inmediatamente
del servidor MySQL a PHP y se conserva en la memoria
del proceso PHP. Esto permite operaciones complementarias
como contar el número de resultados, y desplazar el
puntero de resultado actual. También permite ejecutar consultas adicionales
sobre la misma conexión mientras se trabaja con el conjunto de resultados. La desventaja del almacenamiento en memoria es que los conjuntos de resultados grandes pueden requerir
mucha más memoria. La memoria permanecerá ocupada hasta que
todas las referencias a los conjuntos de resultados sean desactivadas o que los conjuntos de resultados sean liberados explícitamente,
lo cual ocurre de manera automática al final del
proceso. La terminología "store result" también se utiliza con el modo de almacenamiento en memoria, ya que la totalidad de los resultados
se almacenan a la vez.
Nota:
Cuando se utiliza libmysqlclient como biblioteca, el límite de memoria de PHP no contará la memoria utilizada para los
conjuntos de resultados a menos que los datos sean leídos en las variables PHP. Con mysqlnd, la memoria utilizada incluirá
el conjunto de resultados completo.
Las consultas sin almacenamiento en memoria, las consultas MySQL ejecutan su consulta y luego esperan
que los datos del servidor MySQL sean recuperados. Esto utiliza menos memoria
en el lado de PHP, pero puede aumentar la carga
en el servidor. A menos que el conjunto de resultados completo haya sido
recuperado desde el servidor, ninguna otra consulta puede ser
enviada sobre la misma conexión. Las consultas sin almacenamiento en memoria también pueden hacer referencia a un
"use result". Una vez que todas las líneas del conjunto de resultados
han sido recuperadas, el conjunto de resultados desaparece y ya no es posible recorrerlo nuevamente.
Siguiendo estas características, las consultas sin almacenamiento en memoria deben ser utilizadas únicamente
cuando se espera obtener un gran conjunto de resultados que será procesado secuencialmente.
Las consultas sin almacenamiento en memoria presentan varias trampas que las hacen más
difíciles de utilizar, por ejemplo el número de líneas en el conjunto de resultados no es conocido
antes de que la última línea sea recuperada.
Debido a que las consultas son almacenadas en memoria
por omisión, los ejemplos a continuación muestran cómo
ejecutar consultas, con cada API, sin almacenamiento en memoria.
Ejemplo #1 Ejemplo de consultas sin almacenamiento en memoria: 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;
}
?>
Ejemplo #2 Ejemplo de consultas sin almacenamiento en memoria: 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;
}
?>