registros parameter num_rows num mysqli_result mysqli_num_rows mysqli_fetch_assoc mysql_num_rows expects ejemplos contar php memory mysqli

parameter - num_rows php



PHP: cómo se almacenan los resultados de la consulta en mysqli_result (2)

Cuando hice una consulta a 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 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 tantos resultados consuma mucha 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?


Creo que deberías hacer esto en su lugar:

while($row = $r->fetch_assoc()){ //Do whatever you need with the record, then: unset($row); }

La forma en que publicaste recopiló una gran matriz en $rows , y el uso de la memoria refleja eso.


Existe una gran diferencia entre obtener resultados y almacenar un puntero a un recurso.

Si hace echo $r; antes de tu primera llamada a memory_get_usage(); , te darás cuenta de que es solo un puntero. Este es el puntero a su conjunto de resultados. Hasta que fetch los resultados, el conjunto de resultados no se almacenará en la memoria.

Sugeriría que fetchAll() por lo que intentas hacer. Esto dará como resultado un método para acceder a todos sus resultados con un mejor rendimiento, ya que está empeñado en la extensión mysqli (Biblioteca C) en lugar de un bucle en PHP.

También puede usar la función de resultados gratuitos para borrar los resultados de la memoria cuando haya terminado con ellos. Esto es como cerrar un cursor en Java si está familiarizado.