2011-03-10 31 views
7

¿Cuál es la complejidad de esta consulta MySQLMySQL - Complejidad de: SELECT COUNT (*) FROM MyTable;

SELECT COUNT(*) FROM MyTable; 

es el recuento del número de entradas en una tabla almacenada en alguna parte y se actualiza cada vez que se inserta o se elimina una fila? Si ese es el caso, entonces la complejidad debería ser O (1).

+0

Parece que debería ser 'O (N)' en el momento en que vira en una instrucción 'WHERE', así que tenga cuidado al evaluar esto. – crush

Respuesta

8

Depende del motor de almacenamiento.

  • Para MyISAM el recuento total de fila se almacena para cada mesa, así SELECT COUNT(*) FROM yourtable es un O operación (1). Solo necesita leer este valor.
  • Para InnoDB, el recuento total de filas no se almacena, por lo que se requiere una exploración completa. Esta es una operación O (n).

Desde el manual:

InnoDB no impide que una cuenta interna de filas en una tabla. (En la práctica, esto sería algo complicado debido a las múltiples versiones.) Para procesar una declaración SELECT COUNT(*) FROM t, InnoDB debe escanear un índice de la tabla, lo que lleva algún tiempo si el índice no está completamente en el grupo de búferes. Si su tabla no cambia a menudo, usar la caché de consultas MySQL es una buena solución. Para obtener un recuento rápido, debe usar una tabla contraria que cree usted mismo y dejar que la aplicación la actualice de acuerdo con los insertos y la elimine. SHOW TABLE STATUS también se puede usar si un recuento aproximado de filas es suficiente. Ver la Sección 13.2.13.1, "InnoDB Performance Tuning Tips".

+0

Tengo una pregunta. Si por complejidad, nos referimos al número de lecturas de disco, ¿seguirá siendo 'O (n)' para escanear el índice de la tabla? ¿No depende del tipo de índice? –

1

AFAIK en MyISAM filas-count están almacenadas en caché, en InnoDB no, y con cada recuento de todas las filas.

-3

No estoy seguro de si ese valor está almacenado o no, pero eso no es importante en absoluto para su consulta. Al utilizar MySQL con su consulta, contará todas las filas devueltas en el momento en que la ejecute.

+2

Importante o no, es su decisión, ¿no es así? Me parece una pregunta perfectamente válida. –

+0

Es muy importante conocer la complejidad de las funciones, especialmente para evitar largas consultas y realizar otras más inteligentes cuando se tiene una gran cantidad de datos. –