Contar filas de la tabla

165

¿Cuál es el comando MySQL para recuperar el recuento de registros en una tabla?

DJ.
fuente

Respuestas:

236
SELECT COUNT(*) FROM fooTable;

contará el número de filas en la tabla.

Ver el manual de referencia .

Gregory Pakosz
fuente
77
¿Es más rápido cuando uso el nombre de la columna indexada en lugar de *? De esta manera: SELECCIONE tablename
1
Sólo ligeramente. Obtuve una tabla de filas 21961904 que su COUNT consultó en 115 segundos, mientras que usar la ID tomó 107 segundos.
Bondolin
2
COUNT (*) es una definición de lenguaje estricta. Obtendrá un error de análisis si intenta COUNT (*) tenga en cuenta el espacio
ppostma1
9
Puedes hacerlo COUNT(1), esta será la forma más rápida.
Shota Papiashvili
¿Cuál es la mejor manera de usar COUNT () para escribir una variable en PHP? ¿Hago "... COUNT (*) AS rowCount ..." en el SQL, ¿usa $ results-> num_rows, o hay una manera de llamar a este resultado directamente?
Nosajimiki
71

Porque nadie lo mencionó:

show table status;

enumera todas las tablas junto con información adicional, incluidas las filas estimadas para cada tabla. Esto es lo que phpMyAdmin está utilizando para su página de base de datos.

Esta información está disponible en MySQL 4, probablemente también en MySQL 3.23, base de datos de esquemas de información previa de mucho tiempo.

ACTUALIZAR:

Debido a que hubo un voto negativo, quiero aclarar que el número que se muestra se estima para InnoDB y TokuDB y es absolutamente correcto para los motores de almacenamiento MyISAM y Aria (Maria).

Por la documentación :

El número de filas. Algunos motores de almacenamiento, como MyISAM, almacenan el recuento exacto. Para otros motores de almacenamiento, como InnoDB, este valor es una aproximación y puede variar del valor real hasta en un 40% a 50%. En tales casos, use SELECT COUNT (*) para obtener un recuento preciso.

Esta también es la forma más rápida de ver el recuento de filas en MySQL, porque consultas como:

select count(*) from table;

Hacer un análisis completo de la tabla puede ser una operación muy costosa que puede llevar horas en un servidor grande de alta carga. También aumenta la E / S de disco.

La misma operación podría bloquear la tabla para inserciones y actualizaciones; esto ocurre solo en motores de almacenamiento exóticos.

InnoDB y TokuDB están bien con el bloqueo de la tabla, pero necesitan un escaneo completo de la tabla.

Mella
fuente
3
Esta parece ser la forma más eficiente de contar filas. Me pregunto por qué no es la respuesta. Estoy usando InnoDB. Con el bloqueo de la tabla, el número de filas debe ser exacto, ¿verdad?
Chung Lun Yuen
para innodb se estima . pero puede usarlo en algunos casos "Nuestro sitio web tiene miembros xxx", "Detectamos resultados xxx similares a los suyos", etc.
Nick
No estoy seguro. pero para Innodb no es real. Pero es bastante útil para millones de tablas de filas.
Nick
44
Ir a través de las tablas para contar cada fila para obtener un recuento de filas es bastante ridículo. Así que prefiero esta respuesta también.
th3penguinwhisperer
35

Tenemos otra forma de averiguar el número de filas en una tabla sin ejecutar una selectconsulta en esa tabla.

Cada instancia de MySQL tiene una base de datos information_schema. Si ejecuta la siguiente consulta, proporcionará detalles completos sobre la tabla, incluido el número aproximado de filas en esa tabla.

select * from information_schema.TABLES where table_name = 'table_name'\G
Santhosh Tangudu
fuente
¿Esto también es más rápido en una tabla MyISAM ya que MyISAM está almacenando el número de filas?
NaturalBornCamper
Nunca probé esto en MyISAM.
Santhosh Tangudu
6

Simplemente:

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

Solo haz un

SELECT COUNT(*) FROM table;

Puede especificar condiciones con un Dónde después de eso

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

Si tiene varios campos en su tabla y su tabla es enorme, es mejor NO UTILIZAR * porque carga todos los campos en la memoria y usar lo siguiente tendrá un mejor rendimiento

SELECT COUNT(1) FROM fooTable;
Yuseferi
fuente
Esto es incorrecto. Consulte stackoverflow.com/questions/5179969/… COUNT (1) en realidad puede ser mucho más lento para MyISAM.
jcoffland
@jcoffland puedes intentarlo yo solo, especialmente cuando tienes una unión o donde las condiciones son mucho más rápidas que contar (*).
Yuseferi
2

Como mencionó Santosh , creo que esta consulta es adecuadamente rápida, aunque no consulta toda la tabla.

Para devolver el resultado entero del número de registros de datos, para un nombre de tabla específico en una base de datos particular :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';
Mohammad Kanan
fuente
1
Esto puede devolver un número estimado de filas. En un ejemplo, obtuve 55,940,343 filas usando COUNT (*) pero 56,163,339 usando este método, por lo que fue desactivado en más de 200k.
jcoffland
@jcoffland, mencioné la respuesta de Santosh arriba que indica que el resultado es aproximado . Mi respuesta es una consulta práctica más detallada. Es bastante claro en todas las respuestas si desea un uso preciso del conteo count(*)con conocimiento del rendimiento
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
fuente
Esta respuesta está desactualizada, mysql_result está en desuso en PHP 5.5.0 y se eliminó en PHP 7.0.0
Haga de este mundo un lugar mejor el
1

Debe usar count () devuelve el número de filas que coinciden con un criterio específico

select count(*) from table_name;
rashedcs
fuente
0

Si tiene una clave principal o una clave / índice único, el método más rápido posible (probado con tablas de 4 millones de filas)

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

y luego obtener el campo de cardinalidad (es casi instantáneo)

Tiempos donde de 0.4s a 0.0001ms

hamboy75
fuente