Otázka: Proč MySQL neaktualizuje information_schema automaticky a jak mohu toto chování opravit?
Odpověď: InnoDB uchovává hodnotu auto_increment v paměti a neuchovává ji na disku.
Chování dotazů na metadata (např. SHOW TABLE STATUS
) je ovlivněno nastavením innodb_stats_on_metadata
a innodb_stats_persistent
proměnné.
https://dev.mysql.com/doc /refman/8.0/cs/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Vynucení ANALÝZY pokaždé, když se dotazujeme na metadata, může snížit výkon.
Jiné než nastavení těchto proměnných nebo vynucení shromažďování statistik ručním spuštěním ANALYZE TABLE
, Nemyslím si, že existuje „oprava“ problému.
(Myslím, že hlavně proto, že si nemyslím, že je to problém, který by bylo potřeba opravit.)
Chcete-li získat nejvyšší hodnotu sloupce auto_increment v tabulce, normativní vzor je:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Udivuje mě, proč potřebujeme získat tuto konkrétní informaci. K čemu to budeme používat?
Určitě to nepoužijeme v kódu aplikace k určení hodnoty, která byla přiřazena k řádku, který jsme právě vložili. Neexistuje žádná záruka, že nejvyšší hodnota není z řádku, který byl vložen jinou relací. A máme LAST_INSERT_ID()
mechanismus pro načtení hodnoty řádku, který právě vložila naše relace.
Pokud se podíváme na ANALYZE TABLE
pro obnovení statistiky je mezi tím a následným SELECT
ještě malá doba ... další relace by mohla vklouznout další INSERT
takže hodnota, kterou získáme ze shromážděných statistik, mohla být v době, kdy ji získáme, „zastaralá“.