Was bedeutet "Tabelle unterstützt keine Optimierung, sondern Neuerstellung + Analyse"?

97

Ich arbeite an MySQL 5.5 und versuche, eine Indexwiederherstellung mithilfe einer OPTIMIZE TABLEAbfrage durchzuführen. Ich erhalte den folgenden Fehler:

Die Tabelle unterstützt keine Optimierung. Stattdessen wird neu erstellt und analysiert

Was bedeutet das? Erlaubt die MySQL-Engine keine Indexwiederherstellung? Was wird hinter dieser Meldung auf MySQL 5.5 Engine-Ebene getan?

Vikrant Mehr
quelle

Antworten:

189

Das ist wirklich eine Informationsbotschaft.

Wahrscheinlich führen Sie OPTIMIZE für eine InnoDB- Tabelle aus (Tabelle, die die InnoDB-Speicher-Engine anstelle der MyISAM- Speicher-Engine verwendet).

InnoDB unterstützt OPTIMIZE nicht wie MyISAM. Es macht etwas anderes. Es erstellt eine leere Tabelle, kopiert alle Zeilen aus der vorhandenen Tabelle und löscht im Wesentlichen die alte Tabelle, benennt die neue Tabelle um und führt dann eine ANALYSE aus, um Statistiken zu sammeln. Das ist der nächste Schritt, den InnoDB zu einer OPTIMIERUNG machen kann.

Die Meldung, die Sie erhalten, ist im Grunde, dass der MySQL-Server wiederholt, was die InnoDB-Speicher-Engine dem MySQL-Server gesagt hat:

Tabelle unterstützt keine Optimierung , sagt die InnoDB-Speicher-Engine ...

"Ich (die InnoDB-Speicher-Engine) mache keine OPTIMIZE-Operation wie mein Freund (die MyISAM-Speicher-Engine)."

"stattdessen neu erstellen + analysieren" lautet die InnoDB-Speicher-Engine und sagt ...

"Ich habe beschlossen, eine andere Reihe von Operationen durchzuführen, um ein gleichwertiges Ergebnis zu erzielen."

spencer7593
quelle
13
ok, könntest du bitte die andere Art und Weise teilen, wie du es tust?
Vikrant More
Ich bin sicher, dass dies irgendwo im MySQL-Referenzhandbuch steht. Dies ist erwartetes Verhalten und nichts, worüber man sich Sorgen machen müsste. (Außer dass die Tabelle "gesperrt" und nicht verfügbar ist, während der Prozess vollständig ausgeführt wird. Dies kann für eine HUGH JASS-Tabelle eine Weile dauern.) Referenz: https://dev.mysql.com/doc/refman/5.5/ de / optimize-table.html Siehe Abschnitt "InnoDB-Details".
Spencer7593
Sie können auch MySQL Workbench verwenden, um die Tabellenoptimierung durchzuführen. Siehe das Schema und Tabelleninspektor Dokumentation für weitere Informationen. Beachten Sie die Option "Tabelle optimieren".
Philip Olson
1
Hervorragende Erklärung für Menschen, die in der DB-Welt initiieren. Vielen Dank
Tachomi
5
Achtung: Verwenden Sie diese Option nicht, wenn Sie nur noch wenig Speicherplatz haben, da dies dazu führen kann, dass Ihr Server beim Versuch, die sehr große Tabelle neu zu erstellen, zur Neige geht.
Danny Staple
22

OPTIMIZE TABLEFunktioniert gut mit der InnoDB-Engine gemäß dem offiziellen Support-Artikel: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Sie werden feststellen, dass durch die Optimierung von InnoDB-Tabellen die Tabellenstruktur neu erstellt und die Indexstatistik aktualisiert wird (so etwas wie ALTER TABLE).

Beachten Sie, dass diese Nachricht nur zur Information dienen kann und die sehr wichtige Information der Status Ihrer Anfrage ist: nur OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
sdesvergez
quelle
2
Nicht wirklich, MySQL gibt den Fehlergrund an: Temporärer Fehler beim Schreiben von Dateien, Operation fehlgeschlagen.
Wind
9

Die beste Option ist das Erstellen einer neuen Tabelle mit denselben Eigenschaften

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Benennen Sie NEW.NAME.TABLE und TABLE.CRASH um

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Nach der Arbeit gut löschen

DROP TABLE <TABLE.CRASHED.BACKUP>;
tquang
quelle
1
Behält diese Methode Indizes und Trigger bei?
Joel Murphy
1
Ja natürlich. Alle von ihnen! Sie können es versuchen und dann phpMyAdmin für die erneute Überprüfung verwenden
tquang
Dadurch wird der Fremdschlüssel nicht neu erstellt.
DanB
1

Die bessere Option ist, eine neue Tabelle zu erstellen, die Zeilen in die Zieltabelle zu kopieren, die eigentliche Tabelle zu löschen und die neu erstellte Tabelle umzubenennen. Diese Methode eignet sich für kleine Tabellen,

ASHOK MANGHAT
quelle
3
Ich würde vorschlagen, Beispielcode zusammenzustellen, der zu Ihrer Antwort passt. Schauen Sie sich an, wie ich eine gute Antwort schreibe
Frits