D: Perché MySQL non aggiorna automaticamente information_schema e come posso correggere questo comportamento?
R: InnoDB mantiene il valore auto_increment in memoria e non lo mantiene su disco.
Comportamento delle query sui metadati (ad es. SHOW TABLE STATUS
) è influenzato dall'impostazione di innodb_stats_on_metadata
e innodb_stats_persistent
variabili.
https://dev.mysql.com/doc /refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_on_metadata
Forzare un'ANALISI ogni volta che eseguiamo una query sui metadati può compromettere le prestazioni.
Oltre alle impostazioni di tali variabili, o forzare la raccolta di statistiche eseguendo manualmente il ANALYZE TABLE
, non credo che ci sia una "soluzione" per il problema.
(Penso che principalmente perché non penso che sia un problema che deve essere risolto.)
Per ottenere il valore più alto di una colonna auto_increment in una tabella, il modello normativo è:
SELECT MAX(`ai_col`) FROM `myschema`.`mytable`
Quello che mi lascia perplesso è il motivo per cui abbiamo bisogno di recuperare questa particolare informazione. Per cosa lo useremo?
Certamente, non lo useremo nel codice dell'applicazione per determinare un valore che è stato assegnato a una riga che abbiamo appena inserito. Non vi è alcuna garanzia che il valore più alto non provenga da una riga inserita da un'altra sessione. E abbiamo LAST_INSERT_ID()
meccanismo per recuperare il valore di una riga della nostra sessione appena inserita.
Se andiamo con il ANALYZE TABLE
per aggiornare le statistiche, c'è ancora un po' di tempo tra questo e un successivo SELECT
... un'altra sessione potrebbe scivolare in un altro INSERT
in modo che il valore che otteniamo dalle statistiche di raccolta potrebbe essere "scaduto" nel momento in cui lo recuperiamo.