Contare le righe della tabella


165

Qual è il comando MySQL per recuperare il conteggio dei record in una tabella?

Risposte:


236
SELECT COUNT(*) FROM fooTable;

conterà il numero di righe nella tabella.

Vedi il manuale di riferimento .


7
È più veloce quando uso il nome della colonna indicizzata anziché *? In questo modo: SELEZIONA COUNT (id) DAtablename

1
Solo leggermente. Ho ottenuto una tabella di righe 21961904 che il suo COUNT ha richiesto in 115 secondi, mentre l'utilizzo dell'ID ha richiesto 107 secondi.
Bondolin,

2
COUNT (*) è una definizione linguistica rigorosa. Riceverai un errore di analisi se provi COUNT (*) annota lo spazio
ppostma1

9
Puoi farlo COUNT(1), questo sarà il modo più veloce.
Shota Papiashvili,

Qual è il modo migliore per usare COUNT () per scrivere una variabile in PHP? Devo "... COUNT (*) AS rowCount ..." in SQL, utilizza $ results-> num_rows o esiste un modo per chiamare direttamente questo risultato?
Nosajimiki,

71

Perché nessuno lo ha menzionato:

show table status;

elenca tutte le tabelle insieme ad alcune informazioni aggiuntive, comprese le righe stimate per ogni tabella. Questo è ciò che phpMyAdmin sta usando per la sua pagina del database.

Queste informazioni sono disponibili in MySQL 4, probabilmente anche in MySQL 3.23 - database di schemi di informazioni precedenti da molto tempo.

AGGIORNARE:

Poiché vi è stata una votazione negativa , voglio chiarire che il numero mostrato è stimato per InnoDB e TokuDB ed è assolutamente corretto per i motori di archiviazione MyISAM e Aria (Maria).

Per la documentazione :

Il numero di righe. Alcuni motori di archiviazione, come MyISAM, memorizzano il conteggio esatto. Per altri motori di archiviazione, come InnoDB, questo valore è un'approssimazione e può variare dal valore effettivo fino al 40% al 50%. In tali casi, utilizzare SELEZIONA CONTEGGIO (*) per ottenere un conteggio accurato.

Questo è anche il modo più veloce per vedere il conteggio delle righe su MySQL, perché query come:

select count(*) from table;

Eseguendo la scansione della tabella completa, ciò che potrebbe essere un'operazione molto costosa che potrebbe richiedere ore su server di grandi carichi elevati. Aumenta anche l'I / O del disco.

La stessa operazione potrebbe bloccare la tabella per inserimenti e aggiornamenti, ciò accade solo su motori di archiviazione esotici.

InnoDB e TokuDB sono OK con il blocco della tabella, ma richiedono una scansione completa della tabella.


3
Questo sembra il modo più efficiente per contare le righe. Mi chiedo perché non sia la risposta? Sto usando InnoDB. Con il blocco delle tabelle, il numero di righe dovrebbe essere esatto, giusto?
Chung Lun Yuen,

per innodb è stimato . ma puoi usarlo in alcuni casi "Il nostro sito web ha membri xxx", "Abbiamo rilevato risultati xxx simili al tuo" e così via.
Nick,

Non sono sicuro. ma per Innodb non è un conteggio reale. Ma è abbastanza utile per milioni di tabelle di righe.
Nick,

4
Passare attraverso le tabelle per contare ogni riga per ottenere un conteggio delle righe è piuttosto ridicolo. Quindi preferisco anche questa risposta.
th3penguinwhisperer,

35

Abbiamo un altro modo per scoprire il numero di righe in una tabella senza eseguire una selectquery su quella tabella.

Ogni istanza di MySQL ha un database information_schema. Se si esegue la query seguente, verranno forniti dettagli completi sulla tabella, incluso il numero approssimativo di righe in quella tabella.

select * from information_schema.TABLES where table_name = 'table_name'\G

È più veloce anche su una tabella MyISAM poiché MyISAM sta memorizzando il numero di righe?
NaturalBornCamper

Non l'ho mai provato su MyISAM.
Santhosh Tangudu,



3

Basta fare un

SELECT COUNT(*) FROM table;

È possibile specificare le condizioni con un Where dopo quello

SELECT COUNT(*) FROM table WHERE eye_color='brown';

3

Se hai diversi campi nella tua tabella e la tua tabella è enorme, è meglio NON UTILIZZARE * perché carica tutti i campi in memoria e l'utilizzo di quanto segue avrà prestazioni migliori

SELECT COUNT(1) FROM fooTable;

Questo non è corretto Vedi stackoverflow.com/questions/5179969/… COUNT (1) potrebbe effettivamente essere molto più lento per MyISAM.
jcoffland,

@jcoffland puoi provarci da solo, specialmente quando hai un join o dove le condizioni saranno molto più veloci del conteggio (*).
Yuseferi,

2

Come accennato da Santosh , penso che questa query sia opportunamente veloce, senza interrogare tutta la tabella.

Per restituire il risultato intero del numero di set di dati, per un nome di tabella specifico in un determinato database :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';

1
Ciò può restituire un numero stimato di righe. In un esempio, ho ottenuto 55.940.343 righe usando COUNT (*) ma 56.163.339 usando questo metodo, quindi è stato spento di oltre 200k.
jcoffland,

@jcoffland, ho citato la risposta di _ Santosh_ sopra che afferma che il risultato è approssimativo . La mia risposta è una domanda pratica più dettagliata. È abbastanza chiaro tra le risposte se si desidera un conteggio preciso count(*)con consapevolezza delle prestazioni
Mohammad Kanan,

1
$sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
$total = 0;
$sqls = mysql_query($sql,$conn);
if ( $sqls ) {
    $total = mysql_result($sqls, 0);
};
echo "Total:".$total;`

Questa risposta è obsoleta, mysql_result è obsoleta in PHP 5.5.0 e rimossa in PHP 7.0.0
Rendi questo mondo un posto migliore

1

Devi usare count () restituisce il numero di righe che corrisponde a un criterio specificato

select count(*) from table_name;

0

Se si dispone di una chiave primaria o di una chiave / indice univoci, il metodo più rapido possibile (testato con 4 milioni di tabelle di righe)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

e quindi ottieni il campo di cardinalità (è vicino all'istante)

Tempi in cui da 0,4 a 0,0001 ms

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.