Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL aktualisiert information_schema nicht, es sei denn, ich führe ANALYZE TABLE `myTable` manuell aus

F: Warum aktualisiert MySQL information_schema nicht automatisch, und wie kann ich dieses Verhalten beheben?

A: InnoDB hält den auto_increment-Wert im Speicher und speichert ihn nicht auf der Festplatte.

Verhalten von Metadatenabfragen (z. B. SHOW TABLE STATUS ) wird durch die Einstellung von innodb_stats_on_metadata beeinflusst und innodb_stats_persistent Variablen.

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

Jedes Mal, wenn wir Metadaten abfragen, eine ANALYZE zu erzwingen, kann die Leistung beeinträchtigen.

Abgesehen von den Einstellungen dieser Variablen oder dem Erzwingen der Erfassung von Statistiken durch manuelles Ausführen von ANALYZE TABLE , ich glaube nicht, dass es eine "Lösung" für das Problem gibt.

(Ich denke das hauptsächlich, weil ich nicht denke, dass es ein Problem ist, das behoben werden muss.)

Um den höchsten Wert einer auto_increment-Spalte in einer Tabelle zu erhalten, lautet das normative Muster:

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

Was mich verwirrt, ist, warum wir diese bestimmte Information abrufen müssen. Wofür werden wir es verwenden?

Natürlich werden wir das nicht im Anwendungscode verwenden, um einen Wert zu bestimmen, der einer gerade eingefügten Zeile zugewiesen wurde. Es gibt keine Garantie dafür, dass der höchste Wert nicht aus einer Zeile stammt, die von einer anderen Sitzung eingefügt wurde. Und wir haben LAST_INSERT_ID() Mechanismus, um den Wert einer Zeile abzurufen, die unsere Sitzung gerade eingefügt hat.

Wenn wir mit der ANALYZE TABLE gehen Um die Statistik zu aktualisieren, gibt es noch eine kleine Zeit zwischen diesem und einem nachfolgenden SELECT ... eine andere Sitzung könnte in ein weiteres INSERT schlüpfen sodass der Wert, den wir aus den Sammelstatistiken erhalten, zum Zeitpunkt des Abrufs „veraltet“ sein könnte.