P: Dlaczego MySQL nie aktualizuje information_schema automatycznie i jak mogę naprawić to zachowanie?
O: InnoDB przechowuje wartość auto_increment w pamięci i nie przechowuje jej na dysku.
Zachowanie zapytań o metadane (np. SHOW TABLE STATUS
) ma wpływ ustawienie innodb_stats_on_metadata
i innodb_stats_persistent
zmienne.
https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Wymuszanie ANALIZY za każdym razem, gdy wykonujemy zapytanie o metadane, może zmniejszyć wydajność.
Inne niż ustawienia tych zmiennych lub wymuszenie gromadzenia statystyk przez ręczne wykonanie ANALYZE TABLE
, nie sądzę, aby można było rozwiązać ten problem.
(Myślę, że to głównie dlatego, że nie sądzę, że jest to problem, który należy naprawić.)
Aby uzyskać najwyższą wartość kolumny auto_increment w tabeli, wzorcem normatywnym jest:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Zastanawia mnie, dlaczego musimy odzyskać tę konkretną informację. Do czego go użyjemy?
Z pewnością nie użyjemy tego w kodzie aplikacji do określenia wartości, która została przypisana do wiersza, który właśnie wstawiliśmy. Nie ma gwarancji, że najwyższa wartość nie pochodzi z wiersza wstawionego przez inną sesję. I mamy LAST_INSERT_ID()
mechanizm pobierania wartości wiersza, który właśnie wstawiła nasza sesja.
Jeśli pójdziemy z ANALYZE TABLE
aby odświeżyć statystyki, jest jeszcze trochę czasu między tym a kolejnym SELECT
... inna sesja może wsunąć się w kolejną INSERT
aby wartość, którą otrzymujemy ze statystyk zbierania, mogła być „nieaktualna” do czasu jej pobrania.