Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL nie aktualizuje information_schema, chyba że ręcznie uruchomię ANALYZE TABLE `myTable`

P: Dlaczego MySQL nie aktualizuje information_schema automatycznie i jak mogę naprawić to zachowanie?

O: InnoDB przechowuje wartość auto_increment w pamięci i nie przechowuje jej na dysku.

Zachowanie zapytań o metadane (np. SHOW TABLE STATUS ) ma wpływ ustawienie innodb_stats_on_metadata i innodb_stats_persistent zmienne.

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

Wymuszanie ANALIZY za każdym razem, gdy wykonujemy zapytanie o metadane, może zmniejszyć wydajność.

Inne niż ustawienia tych zmiennych lub wymuszenie gromadzenia statystyk przez ręczne wykonanie ANALYZE TABLE , nie sądzę, aby można było rozwiązać ten problem.

(Myślę, że to głównie dlatego, że nie sądzę, że jest to problem, który należy naprawić.)

Aby uzyskać najwyższą wartość kolumny auto_increment w tabeli, wzorcem normatywnym jest:

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

Zastanawia mnie, dlaczego musimy odzyskać tę konkretną informację. Do czego go użyjemy?

Z pewnością nie użyjemy tego w kodzie aplikacji do określenia wartości, która została przypisana do wiersza, który właśnie wstawiliśmy. Nie ma gwarancji, że najwyższa wartość nie pochodzi z wiersza wstawionego przez inną sesję. I mamy LAST_INSERT_ID() mechanizm pobierania wartości wiersza, który właśnie wstawiła nasza sesja.

Jeśli pójdziemy z ANALYZE TABLE aby odświeżyć statystyki, jest jeszcze trochę czasu między tym a kolejnym SELECT ... inna sesja może wsunąć się w kolejną INSERT aby wartość, którą otrzymujemy ze statystyk zbierania, mogła być „nieaktualna” do czasu jej pobrania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wybrać dwie kolumny jako jedną?

  2. MySQL usuwa wiele wierszy w jednym warunku zapytania unikalnym dla każdego wiersza

  3. Jak używać MySQL Found_Rows() w PHP?

  4. Czy mogę używać VARCHAR jako KLUCZA PODSTAWOWEGO?

  5. Zapytanie FULLTEXT z wynikami/rankingami w Postgresql