Cuando realicé una consulta en la base de datos y obtuve los resultados en mysqli_result, el uso de memoria es extremadamente pequeño. Sin embargo, cuando busco todas las filas en los resultados de la consulta en una matriz asociativa, el uso de memoria se vuelve extremadamente alto.PHP: cómo se almacenan los resultados de la consulta en mysqli_result
<?php
require_once("../config.php"); //db connection config
$db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE);
$query ="select * from table_name";
if($r = $db->query($query)){
echo "MEMORY USAGE before : ". memory_get_usage()."<br><br>";
$rows = array();
while($row = $r->fetch_assoc()){
$rows[]= $row;
}
echo "MEMORY USAGE after : ". memory_get_usage()."<br><br>";
//before: 660880
//after: 114655768
// # of records: around 30 thousands
?>
tiene sentido para mí que almacenar esta cantidad de resultados es muy consumo de memoria, pero me pregunto cómo es que mysqli_result es tan pequeño. No puede ser que los resultados se consulten con la base de datos cada vez que se llame a fetch_assoc. Entonces, ¿dónde están los resultados almacenados en la memoria?
Leí en alguna parte que las funciones 'mysql_ *' recuperan todas las filas de resultados del servidor a la vez. Sin embargo, PDO (y probablemente mysqli) recuperar cada fila a pedido. Entonces, con cada llamada a buscar, va a consumir un poco de memoria. Pero usted almacena cada fila en una matriz, por lo que tiene sentido que su uso de memoria se acumule. –
¿Quiere decir que con cada llamada a buscar, mysqli consultará la base de datos para obtener el resultado? – spchuang
Según entiendo, cuando llama a 'query()' MySQL realiza la consulta y se prepara para devolver todas las filas de resultados a PHP. Sin embargo, si mysqli es como PDO (al menos el valor predeterminado de PDO), entonces no comenzará a recibir filas hasta que llame a fetch. A menos que llame a 'fetchAll()', cada fila se recuperará de a una por vez. Esto significa que su uso de memoria se debe a que guardó los resultados en una matriz, no a causa de mysqli. –