sql >> Databáze >  >> RDS >> Mysql

MySQL neaktualizuje information_schema, pokud ručně nespustím ANALYZE TABLE `myTable`

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á“.



  1. Návrat XFS na Linux

  2. Dávkové vložení pomocí nativního SQL v režimu spánku

  3. Líné načítání z databáze, když uživatel posouvá stránku dolů (podobně jako Twitter a Facebook)

  4. Výkon rekurzivních uložených procedur v MYSQL pro získání hierarchických dat