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

MySQL ALTER TABLE zajmuje dużo czasu na małym stole

Przypuszczam, że ALTER TABLE czeka na blokadę metadanych i faktycznie nie zaczyna niczego zmieniać.

Co to jest blokada metadanych?

Po uruchomieniu dowolnego zapytania, takiego jak SELECT/INSERT/UPDATE/DELETE względem tabeli, musi ono uzyskać blokadę metadanych. Te zapytania nie blokują się nawzajem. Dowolna liczba zapytań tego typu może mieć blokadę metadanych.

Ale instrukcja DDL, taka jak CREATE/ALTER/DROP/TRUNCATE/RENAME lub zdarzenie CREATE TRIGGER lub LOCK TABLES, musi uzyskać wyłączność blokada metadanych. Jeśli jakakolwiek transakcja nadal utrzymuje blokadę metadanych, instrukcja DDL czeka.

Możesz to zademonstrować. Otwórz dwa okna terminala i otwórz klienta mysql w każdym oknie.

  • Okno 1:CREATE TABLE foo ( id int primary key );
  • Okno 1:START TRANSACTION;
  • Okno 1:SELECT * FROM foo; -- nie ma znaczenia, że ​​w tabeli nie ma danych

  • Okno 2:DROP TABLE foo; -- zauważ, że czeka

  • Okno 1:SHOW PROCESSLIST;

    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | Id  | User | Host      | db   | Command | Time | State                           | Info             | Rows_sent | Rows_examined |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | 679 | root | localhost | test | Query   |    0 | starting                        | show processlist |         0 |             0 |
    | 680 | root | localhost | test | Query   |    4 | Waiting for table metadata lock | drop table foo   |         0 |             0 |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    

Możesz zobaczyć tabelę upuszczania oczekującą na blokadę metadanych tabeli. Tylko czekam. Jak długo to będzie czekać? Do czasu zakończenia transakcji w oknie 1. W końcu minie limit czasu po lock_wait_timeout sekundy (domyślnie jest to 1 rok ).

  • Okno 1:COMMIT;

  • Okno 2:Zauważ, że przestaje czekać i natychmiast upuszcza stół.

Więc co możesz zrobić? Upewnij się, że nie ma długotrwałych transakcji blokujących ALTER TABLE. Nawet transakcja, która wcześniej wykonała szybki SELECT względem Twojej tabeli, utrzyma blokadę metadanych do momentu zatwierdzenia transakcji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pytanie o MYSQL ON DUPLICATE KEY UPDATE

  2. Jak stworzyć tabelę na podstawie zestawu wyników JDBC

  3. Dodawanie wartości przycisków radiowych do tabeli MYSQL za pomocą PHP

  4. SQL - znajdź parę liczb najbliższą podanej parze

  5. Wyszukiwanie w trybie pełnego tekstu w trybie logicznym MySQL zwraca zbyt wiele wyników