Quando si COUNT(*)
prende in conto gli indici delle colonne, quindi sarà il miglior risultato. Mysql con MyISAM motore memorizza effettivamente il conteggio delle righe, non conta tutte le righe ogni volta che provi a contare tutte le righe. (in base alla colonna della chiave primaria)
Usare PHP per contare le righe non è molto intelligente, perché devi inviare dati da mysql a php. Perché farlo quando puoi ottenere lo stesso dal lato mysql?
Se COUNT(*)
è lento, dovresti eseguire EXPLAIN
la query e controllare se gli indici sono realmente utilizzati e dove dovrebbero essere aggiunti.
Quanto segue non è il modo più veloce , ma c'è un caso in cui COUNT(*)
non si adatta davvero: quando inizi a raggruppare i risultati, puoi incorrere in un problema, in cui COUNT
non conta tutte le righe.
La soluzione è SQL_CALC_FOUND_ROWS
. Questo viene solitamente utilizzato quando si selezionano le righe ma è comunque necessario conoscere il conteggio totale delle righe (ad esempio, per la paginazione). Quando selezioni le righe di dati, aggiungi la SQL_CALC_FOUND_ROWS
parola chiave dopo SELEZIONA:
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
Dopo aver selezionato le righe necessarie, puoi ottenere il conteggio con questa singola query:
SELECT FOUND_ROWS();
FOUND_ROWS()
deve essere chiamato immediatamente dopo la query di selezione dei dati.
In conclusione, tutto si riduce in realtà a quante voci hai e cosa c'è nell'istruzione WHERE. Dovresti davvero prestare attenzione a come vengono utilizzati gli indici, quando ci sono molte righe (decine di migliaia, milioni e oltre).
SELECT 1
e nonSELECT *
. C'è una differenza?