2010-03-20 15 views
28

Mi chiedo quale sia il metodo più efficace se sto letteralmente cercando di ottenere il numero di righe in una tabella.SQL e PHP - Qual è il più veloce 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); 

Chiunque fatto alcun test decente su questo?

risposta

30

mysql_query() trasferisce tutti i record di risultati da MySQL nella pcrocess php prima che ritorni (a differenza di mysql_unbufferd_query()). Questo da solo renderebbe la versione mysql_num_rows() più lenta.

Inoltre per alcuni motori (come MyISAM) MySQL può servire una richiesta di conteggio (*) dall'indice della tabella without hitting the actual data. A SELECT * FROM foo d'altra parte si ottiene una scansione completa della tabella e MySQL deve leggere ogni singolo set di dati.

+0

Grazie a tutti per i vostri post, dovevamo sceglierne uno. La risposta di VolkerK è stata definitiva e informativa. Grazie :) – Joel

0

Credo count(1) sarà ancora più veloce:

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

Anche se non hanno provato i metodi proposti, il primo fa database fetch tutti i record e le considero nel database, il secondo rende database fetch un separato campo per tutti i record e conta il numero di risultati sul server.
Come regola generale meno dati recuperano per un particolare record, meno tempo ci vorrà, quindi voterei per il primo metodo aggiornato (recupero costante per ogni record e conteggio del numero di costanti recuperate).

+1

Se storage engine è MyISAM e ther Non ci sono condizioni 'WHERE',' count (*) 'sarà più veloce, perché il conteggio dei record esatti è memorizzato per le tabelle MyISAM. –

+1

La tua ipotesi potrebbe ritorcersi contro: COUNT (*) è il modo idiomatico di ottenere la dimensione di un set di risultati, e qualsiasi database che ne valga la pena sarà ottimizzato per questo. –

+2

E il * in "Conteggio (*)" significa "Non guardare i dati, conta solo i record" anziché Contare (nome). – VolkerK

0

Non credo che sia necessario alcun test.

Fare il COUNT nella query SQL

1) invia solo una riga di dati indietro la al cliente (invece di ogni riga)

2) Permette di SQL fare il conteggio per voi che è probabilmente andando sempre a per essere più veloce di PHP.

6

Sicuramente il primo. MySQL in genere può farlo osservando un indice piuttosto che l'intera tabella e, se si utilizza MyISAM (il valore predefinito), il conteggio delle righe per la tabella viene memorizzato nei metadati della tabella e verrà restituito all'istante.

Il tuo secondo metodo non solo leggerà l'intera tabella in memoria ma anche la invierà al client attraverso la rete prima che il client conti le righe. Estremamente dispendioso!

-3

Utilizzare Count con index e inodb lo rende troppo lento, ma quando lo si utilizza con mysqli_num_rows restituisce senza alcun ritardo. è possibile controllare il risultato mysqli_num_rows a http://ssajalandhar.org/generalinstruction-0-1-0.html non ci vorrebbe una frazione di secondo per caricare. Per me mysqli funziona benissimo.

6

test nel database con più di 2300000 filari, tipo: InnoDB, dimensioni nei pressi di 1 GB, utilizzando 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 

conclusione: Il metodo più veloce è nella test2:

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