Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL ne met pas à jour information_schema, sauf si j'exécute manuellement ANALYZE TABLE `myTable`

Q : Pourquoi MySQL ne met-il pas automatiquement à jour information_schema, et comment puis-je résoudre ce problème ?

R : InnoDB conserve la valeur auto_increment en mémoire et ne la conserve pas sur le disque.

Comportement des requêtes de métadonnées (par exemple, SHOW TABLE STATUS ) est influencé par le réglage de innodb_stats_on_metadata et innodb_stats_persistent variable.

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

Forcer une ANALYZE à chaque fois que nous interrogeons des métadonnées peut nuire aux performances.

Autre que les paramètres de ces variables, ou forcer la collecte de statistiques en exécutant manuellement la ANALYZE TABLE , je ne pense pas qu'il existe une "solution" au problème.

(Je pense que c'est principalement parce que je ne pense pas que ce soit un problème qui doive être résolu.)

Pour obtenir la valeur la plus élevée d'une colonne auto_increment dans une table, le modèle normatif est :

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

Ce qui me laisse perplexe, c'est pourquoi nous devons récupérer cette information particulière. A quoi va-t-on l'utiliser ?

Certes, nous n'allons pas l'utiliser dans le code de l'application pour déterminer une valeur qui a été affectée à une ligne que nous venons d'insérer. Rien ne garantit que la valeur la plus élevée ne provienne pas d'une ligne insérée par une autre session. Et nous avons LAST_INSERT_ID() mécanisme pour récupérer la valeur d'une ligne que notre session vient d'insérer.

Si nous allons avec le ANALYZE TABLE pour actualiser les statistiques, il reste encore un peu de temps entre cela et un SELECT suivant ... une autre session pourrait se glisser dans un autre INSERT de sorte que la valeur que nous obtenons des statistiques de collecte pourrait être "obsolète" au moment où nous la récupérons.