2012-08-12 6 views

Respuesta

37

diferencia de las tablas MyISAM, InnoDB no mantienen un registro de cuántas filas de la tabla contiene.

Debido a esto, la única manera de saber el número exacto de filas en una tabla InnoDB es inspeccionar cada fila en la tabla y acumular un conteo. Por lo tanto, en las tablas grandes de InnoDB, realizar una consulta SELECT COUNT(*) FROM innodb_table puede ser muy lenta porque realiza un escaneo completo de la tabla para obtener el número de filas.

phpMyAdmin utiliza una consulta como SHOW TABLE STATUS para obtener un conteo estimado de la cantidad de filas en la tabla del motor (InnoDB). Como se trata solo de una estimación, varía cada vez que la llamas, a veces las variaciones pueden ser bastante grandes y, a veces, están cerca.

Aquí hay una publicación informativa en el blog acerca de COUNT(*) for InnoDB tables de Percona.

La página del manual de MySQL para SHOW TABLE STATUS estados:

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 desde el valor real hasta 40 hasta el 50%. En tales casos, use SELECT COUNT (*) para obtener un conteo exacto de .

La página en InnoDB restrictions entra en algo más de detalle:

SHOW TABLE STATUS no da estadísticas precisas sobre las tablas InnoDB, excepto por el tamaño físico reservada por la mesa. El recuento de filas es solo una estimación aproximada utilizada en la optimización de SQL.

InnoDB no mantiene una cuenta interna de filas de una tabla porque transacciones concurrentes pueden “ver” un número diferente de filas en el mismo tiempo. Para procesar una declaración SELECT COUNT(*) FROM t, InnoDB escanea 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, usando el caché de consultas MySQL es una buena solución. Para obtener un recuento rápido, , tiene que usar una tabla de contador creada por usted mismo y dejar que su aplicación la actualice de acuerdo con las inserciones y la elimine. Si es suficiente un recuento aproximado de filas, se puede usar SHOW TABLE STATUS. Ver la Sección 14.3.14.1, “InnoDB Performance Tuning Tips”.

+7

Espere, el punto importante es ** ¿cómo ** hace 'SHOW TABLE STATUS' hacer su estimación? – Pacerier

4

phpMyAdmin utiliza un método rápido para obtener el recuento de filas, y este método solo devuelve un recuento aproximado en el caso de las tablas InnoDB.

Consulte $cfg['MaxExactCount'] para obtener una forma de modificar esos resultados, pero esto podría tener un grave impacto en el rendimiento.

Cuestiones relacionadas