2011-12-24 10 views
13

Sé que no debe confiar en los valores devueltos por InnoDB's SHOW TABLE STATUS. En particular, el recuento de filas y la longitud promedio de los datos.¿Por qué el ESTADO DE LA MESA DE MUESTRA de innodb es tan poco confiable?

Pero pensé que tal vez era un valor preciso tomado en algún momento, y luego innodb solo lo refresca durante una tabla ANALYZE o tal vez algún otro evento infrecuente.

En cambio, lo que estoy viendo es que puedo ejecutar un ESTADO DE LA TABLA DE MOSTRAR en la misma tabla 5 veces en 5 segundos y obtener números completamente diferentes cada vez (a pesar de que la tabla no tiene ninguna actividad de inserción/eliminación)

¿De dónde vienen realmente estos valores? ¿Son simplemente corruptos en innodb?

Respuesta

20

El oficial MySQL 5.1 documentation reconoce que InnoDB no proporciona estadísticas precisas con SHOW TABLE STATUS. Mientras que las tablas MYISAM mantienen específicamente un caché interno de metadatos, como el número de filas, etc., el motor InnoDB almacena datos e índices de tabla en */var/lib/mysql/ibdata **

InnoDB no tiene un archivo de índice expedient permitiendo una consulta rápida de números de fila.

SHOW TABLE STATUS porque InnoDB estima dinámicamente el valor de 'Filas' muestreando un rango de los datos de la tabla (en */var/lib/mysql/ibdata **) y luego extrapola el número aproximado de filas Tanto es así que la documentación InnoDB reconoce número de fila inexactitud de hasta el 50% cuando se utiliza SHOW TABLE STATUS

documentación de MySQL sugiere el uso de la caché de consultas MySQL para obtener consultas número de fila consistente, pero los documentos no especifican cómo . Una explicación sucinta de cómo se puede hacer esto sigue.

En primer lugar, compruebe que el almacenamiento en caché de consultas está habilitado:

mysql> SHOW VARIABLES LIKE 'have_query_cache'; 

Si el valor de have_query_cache es NO a continuación, habilitar la caché de consultas añadiendo las siguientes líneas a /etc/my.cnf y luego reinicia mysqld.

have_query_cache=1 # added 2017 08 24 wh 
query_cache_size = 1048576 
query_cache_type = 1 
query_cache_limit = 1048576 

(para más información ver http://dev.mysql.com/doc/refman/5.1/en/query-cache.html)

consultar el contenido de la memoria caché con

mysql> SHOW STATUS LIKE 'Qcache%'; 

Ahora utiliza la sentencia SQL_CALC_FOUND_ROWS en una consulta SELECT:

SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table 

SQL_CALC_FOUND_ROWS intentará Pt es una lectura desde el caché y, si no se encuentra esta consulta, ejecute la consulta en la tabla especificada y luego ingrese el número de filas de la tabla en el caché de consultas. Las ejecuciones adicionales de la consulta anterior (u otras declaraciones 'cacaotables' SELECT - ver a continuación) consultarán la memoria caché y devolverán el resultado correcto.

posterior 'cachable' SELECT queries - incluso si LIMIT el resultado - consultará a la caché de consultas y permitirá obtener (una vez-off solamente) el número total de filas de la tabla con

SELECT FOUND_ROWS(); 

que devuelve correcta de la consulta en caché anterior total de la fila de la mesa.

+0

Puede explicar qué quiere decir con interrogar a la caché de consultas para obtener las estadísticas PLZ? Comprendo el caché de consultas y cómo funciona, pero no estoy seguro de ver la relevancia del mismo aquí – carpii

+0

He editado mi respuesta para explicar el uso del caché de consultas – venzen

3

Las razones para no mantener estadísticas precisas, incluido el recuento de filas en la tabla, es la multiversión de filas que InnoDB utiliza para proporcionar transacciones. El recuento real de filas realmente depende del nivel de aislamiento de las transacciones (ya que las transacciones no comprometidas pueden tener registros eliminados o insertados), y diferentes transacciones pueden ejecutarse en diferentes niveles de aislamiento, lo que significa que la pregunta "cuántos registros hay 'puede responderse correctamente solo si no hay transacciones en ejecución. Así que mantener un contador de las filas o la longitud de los datos es casi imposible.

Leer más sobre InnoDB restrictions

+0

¿Sabe de dónde vienen realmente los valores cuando emito un SHOW TABLE STATUS? ? No hay transacciones que posiblemente afecten a la tabla, pero los valores todavía parecen completamente aleatorios. – carpii

Cuestiones relacionadas