sql >> Database teknologi >  >> RDS >> Mysql

MySQL opdaterer ikke informationsskema, medmindre jeg manuelt kører ANALYSE TABLE `myTable`

Sp: Hvorfor opdaterer MySQL informationsskema ikke automatisk, og hvordan kunne jeg rette op på denne adfærd?

A: InnoDB holder auto_increment-værdien i hukommelsen og fortsætter den ikke til disken.

Opførsel af metadataforespørgsler (f.eks. SHOW TABLE STATUS ) er påvirket af indstilling af innodb_stats_on_metadata og innodb_stats_persistent variabler.

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

At tvinge en ANALYSE, hver gang vi forespørger om metadata, kan være et dræn på ydeevnen.

Andet end indstillingerne af disse variabler, eller tvinge statistik til at blive indsamlet ved manuelt at udføre ANALYZE TABLE , jeg tror ikke, der er en "fix" til problemet.

(Det tror jeg mest, fordi jeg ikke synes, det er et problem, der skal rettes.)

For at få den højeste værdi af en auto_increment-kolonne i en tabel er det normative mønster:

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

Det, der undrer mig, er, hvorfor vi skal hente netop denne information. Hvad skal vi bruge det til?

Vi kommer bestemt ikke til at bruge det i applikationskoden til at bestemme en værdi, der blev tildelt en række, vi lige har indsat. Der er ingen garanti for, at den højeste værdi ikke er fra en række, der blev indsat af en anden session. Og vi har LAST_INSERT_ID() mekanisme til at hente værdien af ​​en række, vores session lige er indsat.

Hvis vi går med ANALYZE TABLE for at opdatere statistik, er der stadig lidt tid mellem det og en efterfølgende SELECT ... en anden session kunne glide ind i en anden INSERT så den værdi, vi får fra indsamlingsstatistikken, kan være "forældet", når vi henter den.



  1. Adgang nægtet fejl ved brug af mysql_real_escape_string()

  2. Forespørgsel:Find streng i databasefeltet

  3. nhibernate, kalder funktion i Oracle, som returnerer sys refcursor

  4. Kørsel af flere forespørgsler i MySQL uden at bruge underforespørgsel