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.