2009-12-06 15 views
9

Per un InnoDB stoccaggio è meglio contare il numero totale di recordMySQL righe conteggio Performance

  • Uso mysql_num_rows su

    select * from tbl where pk = 1 
    

o

  • recupero della matrice e ret Rieve il valore "totale" da

    select count(*) as total from tbl where pk = 1 
    

?

risposta

13

Assolutamente il secondo. Può afferrare il valore direttamente dall'indice PK, mentre il primo quasi certamente richiede una scansione della tabella (a meno che non sia ogni singola colonna sia parte di un indice e anche in quel caso deve afferrare i valori da tutti gli indici). Quindi, a seconda di come ti stai connettendo al DB, c'è una grande quantità di dati di transito solo per ottenere un conteggio.

explain può aiutare qui. In questo caso, ti dirà che la selezione è ottimizzata.

1

Quest'ultimo è più probabile che funzioni meglio poiché si sta trasmettendo un solo numero intero mentre, nel primo scenario, si inviano molti più dati.

+1

MySQL in realtà non trasmette i dati prima di chiamare 'mysql_fetch_array' – Andomar

+0

quindi in tal caso perché non è il primo uno migliore? – Wolfgang

+0

MySQL continuerà a memorizzare in buffer i risultati dell'interrogazione finché i dati non verranno completamente recuperati. –

4

Oltre alla risposta di Zxpro, c'è anche lo sforzo interno di MySQL:

select * from tbl where pk = 1 

forze MySQL per recuperare righe corrispondenti fisicamente; considerando

select count(*) as total from tbl where pk = 1 

permette MySQL contare voci nella chiave primaria, senza recuperare tutte le righe della tabella

1

Se "pk" è la chiave primaria, ci può essere solo un record, quindi la risposta sta per essere 0 o 1, quindi non è necessario contarli comunque.

Ma sì, il secondo.

InnoDB non ha bisogno di controllare l'indice, ma deve anche verificare che le righe siano visibili alla transazione corrente, a causa di MVCC. Ma questo è un dettaglio. Userà comunque un indice di copertura (che è irrilevante se pk è la chiave primaria, dato che è sempre raggruppato)

Problemi correlati