sql >> Databasteknik >  >> RDS >> Mysql

MySQL uppdaterar inte information_schema, om jag inte manuellt kör ANALYSE TABLE `myTable`

F: Varför uppdaterar inte MySQL information_schema automatiskt, och hur kunde jag fixa detta beteende?

Svar: InnoDB håller värdet auto_increment i minnet och behåller det inte till disken.

Beteende för metadatafrågor (t.ex. SHOW TABLE STATUS ) påverkas av inställningen av innodb_stats_on_metadata och innodb_stats_persistent variabler.

https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata

Att tvinga fram en ANALYS varje gång vi frågar efter metadata kan vara en belastning på prestanda.

Annat än inställningarna för dessa variabler, eller tvingar statistik att samlas in genom att manuellt köra ANALYZE TABLE , jag tror inte att det finns någon "fix" för problemet.

(Jag tror det mest för att jag inte tror att det är ett problem som måste åtgärdas.)

För att få det högsta värdet av en auto_increment-kolumn i en tabell är det normativa mönstret:

 SELECT MAX(`ai_col`) FROM `myschema`.`mytable`

Det som förbryllar mig är varför vi behöver hämta just den här informationen. Vad ska vi använda den till?

Visst, vi kommer inte att använda det i applikationskoden för att bestämma ett värde som tilldelades en rad som vi precis infogade. Det finns ingen garanti för att det högsta värdet inte kommer från en rad som infogats av någon annan session. Och vi har LAST_INSERT_ID() mekanism för att hämta värdet på en rad som vår session just infogade.

Om vi ​​går med ANALYZE TABLE för att uppdatera statistiken är det fortfarande en liten stund mellan det och en efterföljande SELECT ... en annan session kan glida in i en annan INSERT så att värdet vi får från insamlingsstatistiken kan vara "inaktuellt" när vi hämtar det.



  1. Rails väljer slumpmässigt rekord

  2. Varför fungerar inte koden i AJAX framgångsanrop?

  3. Hur använder man Mysql-variabler med Hibernate?

  4. Hämta en lista över privata procedurer/funktioner från en paketkropp