sql >> Database >  >> RDS >> Mysql

MySQL werkt information_schema niet bij, tenzij ik ANALYZE TABLE `myTable` handmatig uitvoer

V: Waarom werkt MySQL information_schema niet automatisch bij en hoe kan ik dit probleem oplossen?

A: InnoDB houdt de auto_increment-waarde in het geheugen en bewaart die niet op schijf.

Gedrag van zoekopdrachten met metagegevens (bijv. SHOW TABLE STATUS ) wordt beïnvloed door de instelling van innodb_stats_on_metadata en innodb_stats_persistent variabelen.

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

Elke keer dat we metadata opvragen een ANALYSE forceren, kan een aanslag zijn op de prestaties.

Behalve de instellingen van die variabelen, of het forceren van het verzamelen van statistieken door handmatig de ANALYZE TABLE uit te voeren , ik denk niet dat er een "oplossing" voor het probleem is.

(Ik denk dat vooral omdat ik niet denk dat het een probleem is dat moet worden opgelost.)

Om de hoogste waarde van een auto_increment-kolom in een tabel te krijgen, is het normatieve patroon:

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

Wat me in de war brengt, is waarom we dit specifieke stukje informatie moeten ophalen. Waar gaan we het voor gebruiken?

We gaan dat zeker niet in applicatiecode gebruiken om een ​​waarde te bepalen die is toegewezen aan een rij die we zojuist hebben ingevoegd. Er is geen garantie dat de hoogste waarde niet afkomstig is van een rij die door een andere sessie is ingevoegd. En we hebben LAST_INSERT_ID() mechanisme om de waarde van een rij op te halen die onze sessie zojuist heeft ingevoegd.

Als we gaan met de ANALYZE TABLE om de statistieken te vernieuwen, zit er nog een kleine tijd tussen dat en een volgende SELECT ... een andere sessie kan in een andere INSERT terechtkomen zodat de waarde die we krijgen van de verzamelde statistieken "verouderd" kan zijn tegen de tijd dat we deze ophalen.



  1. SQL in clausule met nul tot veel parameters

  2. Eerste X-regels van een database verwijderen

  3. MySQL datatype INT(11) terwijl UNSIGNED INT(10)?

  4. SQL-fout:ORA-02291:integriteitsbeperking