sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué el recuento estimado de filas es muy diferente en los resultados de phpmyadmin?

A diferencia de las tablas MyISAM, las tablas InnoDB no realizan un seguimiento de cuántas filas contiene la tabla.

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

phpMyAdmin usa una consulta como SHOW TABLE STATUS para obtener un recuento estimado del número de filas en la tabla del motor (InnoDB). Dado que es solo una estimación, varía cada vez que lo llama, a veces las variaciones pueden ser bastante grandes y, a veces, están cerca.

Aquí hay una publicación de blog informativa sobre COUNT(*) para Tablas InnoDB de Percona.

La página del manual de MySQL para MOSTRAR ESTADO DE LA TABLA 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 del valor real entre un 40% y un 50%. En tales casos, utilice SELECT COUNT(*) para obtener un recuento preciso.

La página de Restricciones de InnoDB entra en más detalles:

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

InnoDB no mantiene un recuento interno de filas en una tabla porque las transacciones concurrentes pueden "ver" diferentes números de filas al mismo tiempo. Para procesar un SELECT COUNT(*) FROM t declaración, InnoDB escanea un índice de la tabla, lo que lleva algún tiempo si el índice no está completamente en el grupo de búfer. Si su tabla no cambia con frecuencia, usar el caché de consultas de MySQL es una buena solución. Para obtener un conteo rápido, debe usar una tabla de contador que cree usted mismo y dejar que su aplicación la actualice de acuerdo con las inserciones y eliminaciones que hace. Si un recuento aproximado de filas es suficiente, SHOW TABLE STATUS se puede usar. Consulte la Sección 14.3.14.1, “Rendimiento de InnoDB Consejos de afinación” .