Funciones que consumen menos tiempo que mysql_num_rows

Hace algunos momentos atras, leia un post escrito de la mano de Javier Gutierrez en la cual explicaba los contras de utilizar mysql_num_rows y que era mejor utilizar dos consultas, una para obtener el numero de registros con COUNT y otra consulta para obtener los datos en caso de que estos existieran.. simplemente me dio algo de curiosidad su especulacion por lo que hice mis propias pruebas y recorri una BD con aproximadamente 20,000 registros para lo cual puse diferente tipo de codigo que utiliza diferentes funciones desde mysql_num_rows, count, found_rows y count+datos.. todo esto paso por un ciclo 50 veces.. y al final obtuve un promedio en segundos del tiempo de respuesta de cada una de estas funciones por lo que el resultado fue el siguiente:
mysql_num_rows: 0.15567102432251 seg
found_rows: 0.14985850811005 seg
count: 0.00037954330444336 seg
count+data: 0.15001650810242 seg
Sorprendentemente hacer 2 consultas, una para conocer el numero de registros y otra para obtener los datos fue mas rapida que los otros metodos, pero la polemica entra cuando la diferencia de respuesta, se basa en unos cuantos milisegundos.. entonces vale la pena utilizar 2 consultas en lugar de mysql_num_rows para ahorrarnos unos cuantos milisegundos. Mi respuesta a este problema es que no vale la pena aunque siendo que COUNT es mucho mas rapido que los demas metodos.. se puede cambiar el flujo de las consultas en las aplicaciones..
A lo que me refiero es que normalmente hacemos una consulta y luego vemos si se retornan registros con mysql_num_rows, si hay registros procedemos a recorrerlos y obtener la información.. todo eso causa consumo de tiempo.. pero viendo los tiempos que consume COUNT, que tal si primero obtenemos el numero de registros con SELECT COUNT, en caso de que hayan registros procederiamos a hacer una consulta para obtener los datos.. y en caso de que no hay registros.. solamente consumi unos cuantos milisegundos y no tuve que hacer toda una consulta como tal..
Aunque sigo pensando aunque parezca contradictorio.. que hacer 2 consultas con un fin similar a utilizar mysql_num_rows no vale la pena..
Y para quienes no sepan que es found_rows, es una manera de consultar el numero de registros retornados en la consulta anterior, esta funcion esta presente en mysql, la forma de uso es “SELECT FOUND_ROWS();” despues de una consulta de selección.
Les dejo en enlace para tomar el codigo que hizo Javier y verifiquen ustedes mismos.. cada loco con su tema..
There are currently no comments highlighted.
Hola Jack,
Antes de que sigan hablando “mal” del mysql_num_rows(), te comento lo mismo que a Javier en su post.
Estás usando de forma incorrecta mysql_num_rows(). Esta función regresa el número de filas en un resultado (después de hacer un SELECT por ejemplo). Esta función “no cuenta”, solo devuelve un valor del resulset generado después del SELECT.
En tu primer ejemplo, es obvio que te lleve más tiempo, ya que lo que te está consumiendo tiempo es la ejecución de la consulta SELECT y no la función mysql_num_rows(). Verificalo cambiando la línea $fInicio=microtime(true); después del mysql_query()
Siempre que quieras contar fila no lo hagas con un SELECT y después un mysql_num_rows() porque, si bien arroja el mismo resultado, esto es ineficiente.
La sentencia SQL COUNT está diseñada para eso, para contar. Por eso es mucho más rápido que un SELECT, porque un SELECT * recupera todos los datos de la tabla y te los trae a tu script (consumiendo más tiempo y obviamente memoria).
Saludos,
Pablo
FOUND_ROWS() es de las típicas funciones que caen en el olvido a pesar de resultar de extrema utilidad en muchas ocasiones, sin perder rendimiento.
Al parecer hemos estado hablando de cosas diferentes.. Quizas el hecho de estos post (El de Javier y el mio), no se refieren a como contar el numero de resultados, sino que se refieren al tiempo que consumen estos scripts al ejecutarlos.. Yo tengo muy claro que COUNT() de MySQL sirve para contabilizar el numero de registros retornados en consulta generada, estos diferentes de valores nulos y que mysql_num_rows() sirve para contar el numero de filas resultantes de una consulta.
El workbench de Guti no se trata de contar filas, sino mas bien del rendimiento que se obtiene a partir del tiempo consumido desde que se inicial el proceso de consulta hasta la obtencion de la informacion.
Es tan facil como hacer una consulta que valide si un usuario existe.. no voy a hacer un SELECT COUNT(*) FROM tabla WHERE nombre = ‘algo’ y si retorna el contador 1 regresar a la BD y hacer otra consulta para obtener la informacion de ese usuario y lo que sigue en php.. en lugar de eso seria mas comodo hacer SELECT dato1,dato2,dato3 FROM tabla WHERE nombre = ‘algo’ luego un mysql_num_rows() y si hay mas de una fila se que el usuario existe y de paso ya tengo la informacion que necesito de el..
Al menos asi lo veo.. nunca utilizaria un COUNT() a menos que quisiera verificar el numero de registros que tengo en determinada tabla y que expresamente me retorne un solo valor esa consulta.