Ich verwende MySQL5.5 mit Master / Slave-Replikation (1 Master, 2 Slaves).
Ich habe einen Prozess, der einmal pro Woche ausgeführt wird und eine bestimmte Tabelle abschneidet. Die Tabelle ist nicht groß und enthält nur wenige tausend Datensätze.
Aus irgendeinem Grund TRUNCATE TABLE
dauert die Ausführung des Befehls sehr lange (sowohl auf dem Master als auch auf dem Slave). Die Ausführung dauert ca. 400K ms !! Wenn es auf dem Slave ausgeführt wird, bleibt es vom Master zurück. Nach dem TRUNCATE TABLE
Ende ist alles wieder normal.
Ich weiß, dass einer der Slaves während der Ausführung keine Lesevorgänge erhalten hat, TRUNCATE TABLE
da es sich um einen dedizierten Slave handelt und der Prozess, der von diesem Slave liest, fehlgeschlagen ist. Bei diesem Slave dauerte die Ausführung genauso lange.
Hier ist die Tabellenstruktur: http://pastebin.com/qEQB4juR
Irgendwelche Gedanken darüber, wie ich die TRUNCATE TABLE beschleunigen kann?
Antworten:
Die Verwendung
TRUNCATE TABLE
in einer InnoDB-Tabelle erfordert eine vollständige Tabellensperre, da TRUNCATE TABLE DDL (Data Definition Language) und nicht DML (Data Manipulation) ist.Dies
DELETE FROM user_engagements;
hilft nicht weiter, da MVCC-Informationen in die Rückgängig-Protokolle in ibdata1 geschrieben werden und dies das Entleeren der Tabelle verhindern kann. Wenn sich nicht festgeschriebene Transaktionen haltenuser_engagements
, kann dies möglicherweise auch eine Verzögerung bedeutenTRUNCATE TABLE
.Sie können die Tabelle umbenennen, damit sie sofort verfügbar ist
Dies sollte sich bis auf die letzte Anweisung schnell replizieren.
Versuche es !!!
Wenn Sie über MySQL 5.1.16+ verfügen, ist
TRUNCATE TABLE
eine DROP- Berechtigung erforderlich . Meine Antwort führt aus, wasTRUNCATE TABLE
jetzt tut.Wenn Sie über MySQL 5.1.15 und zurück verfügen, benötigen Sie die Berechtigung DELETE , die in meiner Antwort behandelt wird.
quelle
RENAME TABLE
stattdessen eine mehrteilige Anweisung verwendenALTER TABLE
, um die Umbenennung atomar zu machen:RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements;
Eine weitere Überlegung ist,DROP TABLE
dass der LRU_mutex gesperrt wird, während die LRU-Liste gescannt und jeder Eintrag entfernt wird - dies blockiert Ihren Server. Percona Server mussinnodb_lazy_drop_table
dabei helfen, kann aberDROP TABLE
auf ext-Dateisystemen noch lange dauern.truncate table
aufgrund der Partitionen in der Tabelle (1000) viel Zeit in Anspruch nimmt. Ich kann sie entfernen, wenn dies zur Lösung führt.