registros num_rows num mysqli_num_rows mysql_num_rows ejemplos contar php sql performance

num_rows - rowcount php



SQL y PHP: ¿cuál es más rápido mysql_num_rows() o ''select count()''? (6)

Me pregunto qué método es el más efectivo si, literalmente, quiero obtener el número de filas en una tabla.

$res = mysql_query("SELECT count(*) as `number` FROM `table1`"); $count = mysql_fetch_result($res,0,''number'');

o

$res = mysql_query("SELECT `ID` FROM `table1`"); $count = mysql_num_rows($res);

¿Alguien hizo alguna prueba decente en esto?


Definitivamente el primero. MySQL generalmente puede hacer esto mirando un índice en lugar de toda la tabla, y si usa MyISAM (el valor predeterminado), el recuento de filas para la tabla se almacena en los metadatos de la tabla y se devolverá al instante .

Su segundo método no solo leerá toda la tabla en la memoria, sino que también la enviará al cliente a través de la red antes de que el cliente cuente las filas. ¡Extremadamente inútil!


El uso de Count con index e inodb lo hace demasiado lento, pero cuando se usa con mysqli_num_rows, se devuelve sin demora. puede consultar el resultado de mysqli_num_rows en http://ssajalandhar.org/generalinstruction-0-1-0.html que no tardaría una fracción de segundo en cargarse. Para mi mysqli funciona genial.


Pruebe en la base de datos con más de 2300000 filas , escriba: InnoDB , tamaño cercano a 1 GiB, usando xhprof

prueba1:

....SELECT COUNT(id) as cnt FROM $table_name....; row= mysqli_fetch_assoc($res2); echo $row[''cnt'']; //result1: 1,144,106 1,230,576 1,173,449 1,163,163 1,218,992

prueba2:

....SELECT COUNT(*) as cnt FROM $table_name....; row= mysqli_fetch_assoc($res2); echo $row[''cnt'']; //result2: 1,120,253 1,118,243 1,118,852 1,092,419 1,081,316

test3:

....SELECT * FROM $table_name....; echo mysqli_num_rows($res2); //result3: 7,212,476 6,530,615 7,014,546 7,169,629 7,295,878

prueba 4:

....SELECT * FROM $table_name....; echo mysqli_num_rows($res2); //result4: 1,441,228 1,671,616 1,483,050 1,446,315 1,647,019

Conclusión: El método más rápido está en el test2:

....SELECT COUNT(*) as cnt FROM $table_name....; row= mysqli_fetch_assoc($res2); echo $row[''cnt''];


Realmente no creo que se necesite ninguna prueba.

Haciendo el COUNT en la consulta SQL

1) Envía solo una fila de datos al cliente (en lugar de cada fila)

2) Permite que SQL haga el recuento por usted, lo que probablemente siempre será más rápido que PHP.


Supongo que count(1) será aún más rápido:

$res = mysql_query("SELECT count(1) as `number` FROM `table1`"); $count = mysql_fetch_result($res,0,''number'');

Aunque no ha probado los métodos propuestos, el primero hace que la base de datos obtenga todos los registros y los cuente en la base de datos, el segundo hace que la base de datos obtenga un campo separado para todos los registros y cuente la cantidad de resultados en el servidor.
Como regla general, entre menos datos obtenga para un registro particular, menos tiempo tomará, por lo tanto, votaría por el primer método actualizado (obteniendo una constante para cada registro y contando el número de constantes obtenidas).


mysql_query() transfiere todos los registros de resultados de MySQL al proceso de php antes de que regrese (a diferencia de mysql_unbufferd_query() ). Solo eso haría que la versión mysql_num_rows () fuera más lenta.

Además, para algunos motores (como MyISAM), MySQL puede servir una solicitud de conteo (*) desde el índice de la tabla sin llegar a los datos reales . Un SELECT * FROM foo por otro lado da como resultado un escaneo completo de la tabla y MySQL tiene que leer cada conjunto de datos.