Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ALTER TABLE impiega molto tempo in una piccola tabella

Immagino che ALTER TABLE sia in attesa di un blocco dei metadati e in realtà non abbia iniziato a modificare nulla.

Che cos'è un blocco dei metadati?

Quando esegui una query come SELECT/INSERT/UPDATE/DELETE su una tabella, deve acquisire un blocco dei metadati. Queste query non si bloccano a vicenda. Qualsiasi numero di query di quel tipo può avere un blocco dei metadati.

Ma un'istruzione DDL come CREATE/ALTER/DROP/TRUNCATE/RENAME o un evento CREATE TRIGGER o LOCK TABLES, deve acquisire un'esclusiva blocco dei metadati. Se una transazione mantiene ancora un blocco dei metadati, l'istruzione DDL attende.

Puoi dimostrarlo. Apri due finestre di terminale e apri il client mysql in ciascuna finestra.

  • Finestra 1:CREATE TABLE foo ( id int primary key );
  • Finestra 1:START TRANSACTION;
  • Finestra 1:SELECT * FROM foo; -- non importa che la tabella non abbia dati

  • Finestra 2:DROP TABLE foo; -- nota che aspetta

  • Finestra 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 |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    

Puoi vedere la tabella di rilascio in attesa del blocco dei metadati della tabella. Solo aspettando. Quanto tempo aspetterà? Fino al completamento della transazione nella finestra 1. Alla fine scadrà dopo lock_wait_timeout secondi (per impostazione predefinita, è impostato su 1 anno ).

  • Finestra 1:COMMIT;

  • Finestra 2:Nota che smette di aspettare e fa cadere immediatamente la tabella.

Che cosa si può fare? Assicurati che non ci siano transazioni di lunga durata che bloccano la tua ALTER TABLE. Anche una transazione che ha eseguito un rapido SELECT sulla tua tabella in precedenza manterrà il blocco dei metadati fino al commit della transazione.