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.