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

¿Por qué SHOW TABLE STATUS de innodb es tan poco confiable?

La documentación oficial de MySQL 5.1 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 tanto los datos de la tabla como los índices en */var/lib/mysql/ibdata**

InnoDB no tiene un archivo de índice conveniente que permita una consulta rápida de números de fila.

SHOW TABLE STATUS porque InnoDB estima dinámicamente el valor de 'Filas' al muestrear un rango de 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 de InnoDB reconoce una inexactitud del número de fila de hasta un 50% cuando se usa SHOW TABLE STATUS

La documentación de MySQL sugiere usar el caché de consultas de MySQL para obtener consultas de número de fila consistentes, pero los documentos no especifican cómo . A continuación se ofrece una breve explicación de cómo se puede hacer esto.

Primero, verifique 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 luego habilite el caché de consultas agregando las siguientes líneas a /etc/my.cnf y luego reinicie mysqld.

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

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

Consultar el contenido de la caché con

mysql> SHOW STATUS LIKE 'Qcache%';

Ahora usa el SQL_CALC_FOUND_ROWS declaración en un SELECT consulta:

SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table

SQL_CALC_FOUND_ROWS intentará una lectura del caché y, si no se encuentra esta consulta, ejecutará la consulta en la tabla especificada y luego confirmará el número de filas de la tabla en el caché de consultas. Ejecuciones adicionales de la consulta anterior (u otra 'caché' SELECT declaraciones - ver más abajo) consultará el caché y devolverá el resultado correcto.

Subsecuente 'cachable' SELECT consultas - incluso si LIMIT el resultado:consultará el caché de consultas y le permitirá obtener (solo una vez) el número total de filas de la tabla con

SELECT FOUND_ROWS();

que devuelve el total correcto de la fila de la tabla de la consulta almacenada en caché anterior.