Bitte beachten Sie, dass OPTIMIZE TABLE keine Defragmentierung durchführt. Intern führt OPTIMIZE TABLE mehrere Vorgänge aus (Kopieren von Daten in eine temporäre Datei, Neuerstellen von Indizes, Neuberechnen von Indexstatistiken). Tatsächlich kann das Beispiel, das ich habe, wie gezeigt manuell ausgeführt werden.
Beispiel: Wenn Sie optimieren mydb.mytable
, geben Sie diesen Befehl ein:
OPTIMIZE TABLE mydb.mytable;
Beachten Sie, dass MySQL unter der Haube Folgendes ausführt:
CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;
Dies ist sehr nützlich für Tabellen mit einer großen Anzahl von UPDATEs und DELETEs
Dies kann zwei Dinge bewirken
Verhindern Sie, dass MySQL Fragmente in einer Tabelle durchsucht, um Daten in Fragmente mit der richtigen Größe zu laden. Das Eliminieren dieser Fragmente verringert diesen Vorgang.
Durch die Neuberechnung der Indexstatistik kann das MySQL Query Optimizer bessere EXPLAIN-Pläne erstellen. Andernfalls können sich Abfragen in der Ausführungszeit verschlechtern, da das MySQL Query Optimizer beschlossen hat, den EXPLAIN-Plan falsch zu erraten. Dies wäre ein eindeutiges Symptom für eine Tabelle mit einem hohen Volumen an UPDATEs und DELETEs.
VORBEHALT
In Bezug auf das Caching macht das Caching aufgrund eines vollständigen Tabellenscans einen schnellen Sprung. Für MyISAM fließen Indexseiten in den MyISAM-Schlüsselcache ein und aus. Bei InnoDB fließen Daten- und Indexseiten in den InnoDB-Pufferpool hinein und aus diesem heraus.