2011-02-25 14 views
8

Tengo una tabla usando innodb. Sé que la mesa tiene aproximadamente 89 millones de filas. ConMySQL obtener el número de filas en una tabla innodb

SELECT COUNT(*) FROM table; 

demora unos cinco minutos en ejecutarse. Sé que innodb no está optimizado para consultas COUNT (*) incondicionales. ¿Cómo puedo reestructurar la consulta para darme un conteo más rápido? ¿Agregaría simplemente DONDE 1 = 1 trabajo, o debo consultar un campo específico?

Sé que puedo obtener el número aproximado de filas utilizando SHOW TABLE STATUS, pero quiero obtener el valor en un script PHP, y parece que hay mucho por explorar con ese método.

+2

Véase también: http://www.tocker.ca/2013/05/02/fastest-way-to-count-rows-in-a-table.html –

Respuesta

17

Si estás bien con la cantidad estimada y simplemente no quiere meterse con el funcionamiento de SHOW TABLE STATUS desde PHP, puede utilizar la base de datos INFORMATION_SCHEMA:

SELECT TABLE_ROWS FROM information_schema.tables 
WHERE TABLE_SCHEMA = 'my_db_name' 
AND TABLE_NAME = 'my_table_name'; 
+0

Tengo curiosidad sobre cómo esto es "estimado". ¿Podría alguien proporcionarme más información sobre eso? ¿Por qué este número no sería completamente exacto? Gracias. –

+2

@MMiller - Puede leerlo al respecto aquí: http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html – Galz

+0

+1 Muy bueno para cuando lo necesitemos no use 'WHERE'. Si usa 'WHERE', tal vez un' SELECT count (1) 'sea la mejor salida (no sé si esto hace que se visualice un buffer de todas las líneas). –

-5

mysql_num_rows puede ser útil para usted.

+3

¿Eso no solo da el número de filas en un conjunto de resultados en búfer? Estoy buscando el número de filas en la tabla completa. – Wige

3

Si la tabla se lee con frecuencia y se actualiza con poca frecuencia, es posible que desee considerar la creación de una tabla de estadísticas que se actualiza a través de triggers al realizar cambios en la tabla.

6

Si está bien con el número aproximado de registros, puede usar la salida de "explain".

versión alemana simplificado del código es

$result = mysql_query('explain SELECT count(*) from TABLE_NAME'); 
$row = mysql_fetch_assoc($result); 
echo $row['rows']; 
Cuestiones relacionadas