Contar linhas da tabela

165

Qual é o comando do MySQL para recuperar a contagem de registros em uma tabela?

DJ.
fonte

Respostas:

236
SELECT COUNT(*) FROM fooTable;

contará o número de linhas na tabela.

Veja o manual de referência .

Gregory Pakosz
fonte
7
É mais rápido quando eu uso o nome da coluna indexada em vez de *? Assim: SELECT COUNT (id) FROMtablename
1
Só um pouco. Recebi uma tabela de linhas 21961904 que sua COUNT consultou em 115 segundos, enquanto o ID demorava 107 segundos.
Bondolin
2
COUNT (*) é uma definição estrita de idioma. Você receberá um erro de análise se tentar COUNT (*) anotar o espaço
ppostma1
9
Você pode fazer COUNT(1), este será o caminho mais rápido.
Shota Papiashvili 14/09/16
Qual é a melhor maneira de usar COUNT () para escrever uma variável em PHP? Eu faço "... COUNT (*) AS rowCount ..." no SQL, ele usa $ results-> num_rows, ou existe uma maneira de chamar esse resultado diretamente?
Nosajimiki
71

Porque ninguém mencionou:

show table status;

lista todas as tabelas junto com algumas informações adicionais, incluindo linhas estimadas para cada tabela. É isso que o phpMyAdmin está usando na página do banco de dados.

Esta informação está disponível no MySQL 4, provavelmente no MySQL 3.23 - banco de dados de esquemas de informações anteriores há muito tempo.

ATUALIZAR:

Como houve voto negativo, quero esclarecer que o número mostrado é estimado para InnoDB e TokuDB e é absolutamente correto para os mecanismos de armazenamento MyISAM e Aria (Maria).

De acordo com a documentação :

O número de linhas. Alguns mecanismos de armazenamento, como o MyISAM, armazenam a contagem exata. Para outros mecanismos de armazenamento, como o InnoDB, esse valor é uma aproximação e pode variar do valor real em até 40% a 50%. Nesses casos, use SELECT COUNT (*) para obter uma contagem precisa.

Essa também é a maneira mais rápida de ver a contagem de linhas no MySQL, porque consultas como:

select count(*) from table;

Fazendo uma varredura completa da tabela, o que poderia ser uma operação muito cara, que pode levar horas em um servidor grande de carga alta. Também aumenta a E / S do disco.

A mesma operação pode bloquear a tabela de inserções e atualizações - isso acontece apenas em mecanismos de armazenamento exóticos.

O InnoDB e o TokuDB estão bem com o bloqueio de tabela, mas precisam de uma verificação completa da tabela.

usuario
fonte
3
Parece a maneira mais eficiente de contar linhas. Eu me pergunto por que não é a resposta? Estou usando o InnoDB. Com o bloqueio de tabela, o número de linhas deve ser exato, certo?
Chung Lun Yuen
para innodb é estimado . mas você pode usá-lo em alguns casos "Nosso site tem xxx membros", "Detectamos resultados xxx semelhantes aos seus" e assim por diante.
27416 Nick
Não tenho certeza. mas para Innodb não é contagem real. Mas é bastante útil para milhões de tabelas de linhas.
28416 Nick
4
Passar pelas tabelas para contar cada linha para obter uma contagem de linhas é bastante ridículo. Então, eu prefiro essa resposta também.
Th3penguinwhisperer
35

Temos outra maneira de descobrir o número de linhas em uma tabela sem executar uma selectconsulta nessa tabela.

Toda instância do MySQL possui banco de dados information_schema. Se você executar a consulta a seguir, fornecerá detalhes completos sobre a tabela, incluindo o número aproximado de linhas nessa tabela.

select * from information_schema.TABLES where table_name = 'table_name'\G
Santhosh Tangudu
fonte
Isso também é mais rápido em uma tabela MyISAM, pois o MyISAM está armazenando o número de linhas?
NaturalBornCamper 08/03
Eu nunca testei isso no MyISAM.
Santhosh Tangudu
6

Simplesmente:

SELECT COUNT(*) FROM `tablename`
David Snabel-Caunt
fonte
5
select count(*) from YourTable
Adriaan Stander
fonte
3

Basta fazer um

SELECT COUNT(*) FROM table;

Você pode especificar condições com um Onde depois disso

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

Se você tiver vários campos em sua tabela e sua tabela for enorme, é melhor NÃO UTILIZAR, * pois carrega todos os campos na memória e, usando o seguinte, terá melhor desempenho

SELECT COUNT(1) FROM fooTable;
Yuseferi
fonte
Isto está incorreto. Veja stackoverflow.com/questions/5179969/… COUNT (1) pode realmente ser muito mais lento para o MyISAM.
Jcoffland # 25/18
@ jcoffland, você pode tentar sozinho, especialmente quando você tem uma associação ou onde as condições são muito mais rápidas que a contagem (*).
Yuseferi 26/1018
2

Como mencionado por Santosh , acho que essa consulta é adequadamente rápida, embora não esteja consultando toda a tabela.

Para retornar o resultado inteiro do número de registros de dados, para um nome de tabela específico em um banco de dados específico :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';
Mohammad Kanan
fonte
1
Isso pode retornar um número estimado de linhas. Em um exemplo, obtive 55.940.343 linhas usando COUNT (*), mas 56.163.339 usando esse método, de modo que foi desativado em mais de 200k.
jcoffland
@ jcoffland, mencionei a resposta de _ Santosh_ acima da qual afirma que o resultado é aproximado . Minha resposta é uma consulta prática mais detalhada. Sua bastante claro em toda respostas, se você quer o uso contagem precisa count(*)com a consciência desempenho
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;`
alpc
fonte
Esta resposta está desatualizada, mysql_result está obsoleto no PHP 5.5.0 e removido no PHP 7.0.0
Faça deste mundo um lugar melhor
1

Você precisa usar count () retorna o número de linhas que correspondem a um critério especificado

select count(*) from table_name;
rashedcs
fonte
0

Se você possui uma chave primária ou uma chave / índice exclusivo, o método mais rápido possível (testado com 4 milhões de tabelas de linhas)

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

e, em seguida, obtenha o campo de cardinalidade (é quase instantâneo)

Tempos em que 0,4s a 0,0001ms

hamboy75
fonte