В: Защо MySQL не актуализира автоматично information_schema и как мога да коригирам това поведение?
А: 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 TABLE
, не мисля, че има "поправка" на проблема.
(Мисля, че най-вече защото не мисля, че това е проблем, който трябва да бъде отстранен.)
За да получите най-високата стойност на колона auto_increment в таблица, нормативният модел е:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Това, което ме озадачава, е защо трябва да извлечем тази конкретна информация. За какво ще го използваме?
Разбира се, ние няма да използваме това в кода на приложението, за да определим стойност, която е присвоена на ред, който току-що вмъкнахме. Няма гаранция, че най-високата стойност не е от ред, който е бил вмъкнат от друга сесия. И имаме LAST_INSERT_ID()
механизъм за извличане на стойността на ред, който току-що вмъкна от нашата сесия.
Ако отидем с ANALYZE TABLE
за да обновите статистиката, все още има малко време между това и последващо SELECT
... друга сесия може да се вмъкне в друг INSERT
така че стойността, която получаваме от събираните статистически данни, може да бъде „неактуална“ до момента, в който я извлечем.