Cosa può richiedere molto tempo a TRUNCATE TABLE?


9

Sto eseguendo MySQL5.5 con replica Master / Slave (1 master, 2 slave).

Ho un processo che viene eseguito una volta alla settimana e troncare una tabella specifica. La tabella non è grande e contiene solo poche migliaia di record.

Per qualche motivo, l' TRUNCATE TABLEesecuzione del comando richiede molto tempo (sia sul master che sullo slave). Ci vogliono circa 400K ms per l'esecuzione !! Quando gira sullo slave, lo fa ritardare dal Master. Al TRUNCATE TABLEtermine, tutto è tornato alla normalità.

So che uno degli schiavi non ha ricevuto alcuna lettura durante l'esecuzione TRUNCATE TABLEpoiché è uno schiavo dedicato e il processo che legge da quello schiavo era inattivo. Inoltre, su questo slave, è stata eseguita la stessa quantità di tempo per l'esecuzione.

Ecco la struttura della tabella: http://pastebin.com/qEQB4juR

Qualche idea su come posso accelerare la TABELLA TRUNCATE?


C'è qualche partizione sul tavolo?
Barbaros Alp,

Risposte:


8

L'utilizzo TRUNCATE TABLEsu una tabella InnoDB richiede un blocco completo della tabella poiché TRUNCATE TABLE è DDL (Data Definition Language) non DML (Data Manipulation).

Non DELETE FROM user_engagements;sarà d'aiuto perché le informazioni MVCC vengono scritte nei registri di annullamento in ibdata1 e ciò può impedire che la tabella venga svuotata. Se qualsiasi transazione non impegnata viene trattenuta user_engagements, ciò potrebbe potenzialmente contenere anche un TRUNCATE TABLE.

È possibile rinominare la tabella in modo che sia immediatamente disponibile

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

Questo dovrebbe replicarsi rapidamente tranne per l'ultima affermazione.

Provaci !!!

Se hai MySQL 5.1.16+, TRUNCATE TABLErichiede il privilegio DROP . La mia risposta esegue ciò che TRUNCATE TABLEora fa.

Se hai MySQL 5.1.15 e versioni successive, hai bisogno del privilegio DELETE , che copre la mia risposta.


2
Vorrei usare RENAME TABLEun'istruzione multiparte invece che ALTER TABLEper rendere atomica la ridenominazione: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; un'altra considerazione è che DROP TABLEfa bloccare LRU_mutex mentre viene scansionato l'elenco LRU e viene rimossa ogni voce - questo bloccherà il server. Percona Server deve innodb_lazy_drop_tableaiutare in questo, ma DROP TABLEpuò ancora richiedere molto tempo sui filesystem ext.
Aaron Brown,

potrebbe essere che ci truncate tablesta impiegando molto tempo a causa delle partizioni sul tavolo (1000), posso rimuoverle se ciò porterà alla soluzione?
Ha funzionato il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.