2011-11-15 25 views
7

Hace poco actualicé un Joomla! instalación de 1.5 a 1.7 con un gran conjunto de datos de artículos y mientras el método de actualización mejoraba la base de datos (insertando el contenido en otra tabla, básicamente) noté que el valor de la columna Filas tenía un prefijo (~):phpMyAdmin - ¿Qué significa una tilde (~) en la columna de filas?

See image

Ahora, a primera vista, supongo que esto significa que el valor es aproximado porque cuando actualizo la página veo un valor diferente, a veces más alto, a veces más bajo. OK, digamos que el valor es aproximado, en ese caso, ¿qué está causando eso? Algunas consideraciones:

  • OS: Windows 7.
  • Servidor: Apache 2 con PHP 5.3 y MySQL 5.1.50 en la comunidad.

Respuesta

11

El recuento de filas es una aproximación utilizada para la optimización de consultas por InnoDB. hacer un conteo (*) es mucho más ineficiente y tener una idea aproximada del número de filas es suficiente para optimizar el plan de consulta. phpMyAdmin va a hacer una consulta "Mostrar estado de la tabla" para obtener la información sobre la mesa:

http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html

Para otros motores, como InnoDB, este valor es una aproximación , y puede variar de el valor real por tanto como 40 a 50%. En tales casos, use SELECT COUNT (*) para obtener un recuento exacto.

+0

Gracias bencoder, por lo que voy a comprobar si es conveniente cambiar el motor de almacenamiento. Aprecio tu ayuda. –

+0

De nada. No puedo ver por qué es necesario sin embargo. ¿Confías en esta salida de phpmyadmin por algo? Probablemente sea mucho mejor escribir una página específica que le proporcione el valor correcto usando count (*) – bencoder

+0

No saque la conclusión incorrecta. Su configuración no está rota y no es necesario cambiar el motor de almacenamiento. –

1

¿Cuáles son los tipos de tabla? Las tablas MyISAM almacenan un recuento exacto de filas en sus metadatos. Las tablas de InnoDB no pueden, ya que el recuento exacto de filas varía dependiendo de qué transacciones están en "vuelo", por lo que el recuento que se muestra se marca como una estimación (~ = "aproximadamente") en lugar de "es exactamente esta cantidad ".

+0

Gracias Marc, son InnoDB. –

7

De acuerdo con la MySQL Manual on InnoDB restrictions:

  • SHOW TABLE STATUS no da estadísticas precisas sobre InnoDB tablas, 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 impide que una cuenta interna de filas en una tabla porque las transacciones concurrentes pueden "ver" un número diferente de filas al mismo tiempo. Para procesar una declaración SELECT COUNT(*) FROM t, InnoDB debe analizar 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. Si un recuento aproximado de filas es suficiente, se puede usar SHOW TABLE STATUS. Ver la Sección 13.2.13.1, "InnoDB Performance Tuning Tips".

Según la page para SHOW TABLE STATUS, muestra InnoDB rowcounts pueden variar del recuento real hasta en un 50%.

+0

Eso no es nada exacto. –

+0

No creo que esa palabra signifique lo que piensas que significa. –

+0

Veo, es solo una referencia. –

Cuestiones relacionadas