Q: Почему MySQL не обновляет информационную_схему автоматически и как я могу исправить это поведение?
A: InnoDB хранит значение auto_increment в памяти,и не сохраняется на диске.
На поведение запросов метаданных (например, SHOW TABLE STATUS
) влияет установка innodb_stats_on_metadata
и innodb_stats_persistent
переменных.
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Применение ANALYZE каждый раз, когда мы запрашиваем метаданные, может привести к снижению производительности.
Кроме настроек этих переменных или сбора статистики путем ручного выполнения ANALYZE TABLE
, я недумаю, что есть «решение» для этой проблемы.
(я думаю, что в основном потому, что я не думаю, что это проблема, которую нужно исправить.)
Чтобы получить самую высокуюзначение столбца auto_increment в таблице, нормативный шаблон:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Что меня удивляет, так это то, почему нам нужно извлечь именно этот фрагмент информации.Для чего мы будем его использовать?
Конечно, мы не собираемся использовать это в коде приложения для определения значения, которое было присвоено только что вставленной строке.Нет гарантии, что самое высокое значение не из строки, которая была вставлена каким-либо другим сеансом.И у нас есть механизм LAST_INSERT_ID()
для извлечения значения строки, которую только что вставили в нашу сессию.
Если мы воспользуемся ANALYZE TABLE
для обновления статистики, между этим и последующим * 1035 еще будет небольшой промежуток времени* ... другой сеанс может проскользнуть в другой INSERT
, так что значение, которое мы получим из статистики сбора, может быть "устаревшим" к моменту его получения.