Vorteile der Ausführung der OPTIMIZE TABLE-Abfrage in MySQL DB Server

9

Ich würde gerne wissen, welche Vorteile [wirklich praktisch] durch Ausführen der OPTIMIZE TABLE tbl_nameAbfrage in MySQL Server erzielt werden können.

Ich habe dies einmal überprüft und festgestellt, dass der nächste DB-Treffer nach dem Ausführen möglicherweise lange dauert, weil Fragmente oder so verschoben wurden. Nachfolgende Treffer zeigen jedoch eine gewisse Leistung. Ich bin mir nicht sicher, ob das Abfrage-Caching diesen Trick ausführt mit Optimierung oder Optimierung allein macht diesen Trick.

Kann mich jemand mit einigen echten Leistungsunterschieden führen, wenn möglich, damit ich weiterarbeiten kann, da die Arbeit mit MySQL in unserem Projekt an Bedeutung gewinnt?

Saravanan
quelle

Antworten:

7

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

  1. 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.

  2. 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.

RolandoMySQLDBA
quelle
Danke für deine Antwort. Aus Ihrer Sicht verstehe ich, dass ich einen Dienst wie einen Cron-Job besser benutze, um eine Optimierungstabelle für eine meiner häufig aktualisierten Tabellen zu planen, damit ich eine bessere Leistung erzielen kann. Darüber hinaus verwende ich InnoDB für diese Tabelle. Ist das eine bessere Wahl? Außerdem finde ich HASH-Joins in SQL Server, die vorgeschlagen wurden, um die Abfrageleistung zu verbessern. Können Sie mir dies bitte erklären und wie Sie eine ähnliche in MySQL erhalten. Bitte geben Sie mir auch einen SQL Query Optimizer für MySQL [Windows7 Version].
Saravanan
@savaranan: Das MySQL Query Optimizer, auf das ich mich bezog, war das in MySQL integrierte interne. Übrigens: Da die Tabelle, die Sie optimieren möchten, InnoDB ist, können Sie die Schritte DISABLE KEYS und ENABLE KEYS überspringen. Außerdem kann ANALYZE TABLE übersprungen werden, da es für InnoDB-Tabellen völlig nutzlos ist, da InnoDB seine Tabellenkardinalitäten durch enge Annäherungen unter Verwendung der Seiten aus den BTREE-Indizes, so genannten Index-Tauchgängen, neu berechnet.
RolandoMySQLDBA
@savaranan: In Bezug auf HASH-Indizes verfügt InnoDB über adaptive Hash-Indizes ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). Es gibt auch nette Vorschläge zum Emulieren Ihrer eigenen Hash-Indizes und zum Behandeln von Kollisionen basierend auf den Seiten 103-106 von "High Performance MySQL" ( amazon.com/dp/0596101716 )
RolandoMySQLDBA