2010-03-20 35 views
28

Me pregunto qué método es más efectivo si, literalmente, solo quiero obtener el número de filas en una tabla.SQL & PHP - ¿Cuál es más rápido mysql_num_rows() o 'select count()'?

$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); 

Cualquier persona decente hecho ninguna prueba de esto?

Respuesta

30

mysql_query() transfiere todos los registros de resultados de MySQL al php pcrocess 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 (*) del índice de la tabla without hitting the actual data. Un SELECT * FROM foo por el contrario da como resultado una exploración de tabla completa y MySQL tiene que leer cada conjunto de datos.

+0

Gracias a todos por sus publicaciones, tuve que elegir una. La respuesta de VolkerK fue definitiva e informativa. Gracias :) – Joel

0

supongo 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 se han probado los métodos propuestos, la primera base de datos hace que traiga todos los registros y los cuenta en la base de datos, la segunda base de datos hace que traiga una por separado campo para todos los registros y cuente la cantidad de resultados en el servidor.
Como regla general, mientras menos datos obtenga para un registro en particular, menos tiempo tomará, por lo tanto, votaría por el primer método actualizado (obteniendo constantes para cada registro y contando el número de constantes recuperadas).

+1

Si el motor de almacenamiento es MyISAM e El r e no hay condiciones 'WHERE',' count (*) 'será más rápido, porque el conteo exacto de registros se almacena para las tablas MyISAM. –

+1

Su conjetura podría ser contraproducente: COUNT (*) es la forma idiomática de obtener el tamaño de un conjunto de resultados, y cualquier base de datos que valga la pena será optimizada para ello. –

+2

Y * en 'Count (*)' significa "No mires los datos, solo cuenta los registros" en lugar de Count (colname). – VolkerK

0

Realmente no creo que sea necesario realizar ninguna prueba.

Hacer el recuento en la consulta SQL

1) Envía una sola fila de datos de nuevo la al cliente (en vez de cada fila)

2) permite que SQL hacer el recuento para usted que es probablemente siempre yendo para ser más rápido que PHP.

6

Definitivamente el primero. MySQL generalmente puede hacer esto mirando un índice en lugar de la tabla completa, 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 derrochador

-3

El uso de Recuento con índice e inodb lo hace demasiado lento, pero cuando lo usa con mysqli_num_rows, vuelve sin demora. puede verificar el resultado de mysqli_num_rows en http://ssajalandhar.org/generalinstruction-0-1-0.html, no tardaría una fracción de segundo en cargarse. Para mí, mysqli funciona increíble.

6

de prueba en la base de datos con más de 2.300.000 filas, tipo: InnoDB, de tamaño de cerca de 1 GiB, utilizando xhprof

test1:

....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 

test2:

....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 

test4:

 ....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 es en el test2:

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