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

MySQL no actualiza information_schema, a menos que ejecute manualmente ANALYZE TABLE `myTable`

P: ¿Por qué MySQL no actualiza information_schema automáticamente y cómo puedo corregir este comportamiento?

R: InnoDB mantiene el valor de auto_incremento en la memoria y no lo conserva en el disco.

Comportamiento de las consultas de metadatos (p. ej., SHOW TABLE STATUS ) está influenciado por la configuración de innodb_stats_on_metadata y innodb_stats_persistent variables.

https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata

Forzar un ANALIZAR cada vez que consultamos metadatos puede ser una carga para el rendimiento.

Además de la configuración de esas variables, o forzar la recopilación de estadísticas mediante la ejecución manual de ANALYZE TABLE , no creo que haya una "solución" para el problema.

(Creo que principalmente porque no creo que sea un problema que deba solucionarse).

Para obtener el valor más alto de una columna de incremento automático en una tabla, el patrón normativo es:

 SELECT MAX(`ai_col`) FROM `myschema`.`mytable`

Lo que me desconcierta es por qué necesitamos recuperar esta información en particular. ¿Para qué lo vamos a usar?

Ciertamente, no vamos a usar eso en el código de la aplicación para determinar un valor que se asignó a una fila que acabamos de insertar. No hay garantía de que el valor más alto no sea de una fila insertada por alguna otra sesión. Y tenemos LAST_INSERT_ID() mecanismo para recuperar el valor de una fila que nuestra sesión acaba de insertar.

Si vamos con la ANALYZE TABLE para actualizar las estadísticas, todavía hay un pequeño tiempo entre eso y un SELECT posterior ... otra sesión podría colarse en otro INSERT por lo que el valor que obtenemos de las estadísticas recopiladas podría estar "desactualizado" en el momento en que lo recuperemos.