Was ist der Unterschied zwischen Tabelle optimieren und Tabelle analysieren in MySQL? Ich habe die Online-Dokumentation gelesen, bin mir aber nicht sicher, worin der Unterschied besteht.
So erweitern Sie die Antwort von @ MitchWheat (+1 für die direkte Beantwortung zuerst):
ANALYZE TABLE untersucht die Schlüsselverteilung und speichert sie in INFORMATION_SCHEMA.STATISTICS .
OPTIMIZE TABLE führtnach einer gewissen Tabellenkomprimierung ANALYZE TABLE aus. Das Äquivalent dazu,OPTIMIZE TABLE mydb.mytable;
wenn die Tabelle MyISAM war, lautet wie folgt:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Für die MyISAM-Tabelle mydb.mytable in datadir /var/lib/mysql
haben Sie folgende Dateien:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(Daten)/var/lib/mysql/mydb/mytable.MYI
(Indizes)OPTIMIZE TABLE mydb.mytable
würde die .MYD
und .MYI
Dateien für die Tabelle verkleinern .
Dies gilt nicht für InnoDB. So ist es anders:
Die Daten und Indizes jeder Tabelle werden in einer externen Tablespace-Datei gespeichert. Für datadir
is /var/lib/mysql
und die Tabelle mydb.mytable
würde es wie folgt gespeichert:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Wenn OPTIMIZE TABLE mydb.mytable
ausgeführt wird, mytable.ibd
wird geschrumpft.
Nur /var/lib/mysql/mydb/mytable.frm
würde existieren. Alle Daten- und Indexseiten für die Tabelle mydb.mytable
werden in der System-Tablespace-Datei gespeichert /var/lib/mysql/ibdata1
.
Bei der OPTIMIZE TABLE mydb.mytable
Ausführung werden die Daten- und Indexseiten zusammenhängend in ibdata1 geschrieben. Leider wächst ibdata1 dadurch sprunghaft.
Siehe die bildliche Darstellung von Percona CTO Vadim Tkachenko
Ihr Kommentar war
Ich denke, Optimierungstabelle für Innodb wird nicht unterstützt. Ich habe eine Nachricht erhalten, der Index wird neu erstellt. Wie funktioniert es?
Ich habe es ausprobiert
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
Du hast Recht. Sie können nicht OPTIMIZE TABLE
als einzelne Operation ausgeführt werden. Was InnoDB stattdessen tut, ist das Folgende:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Sie können diese Schritte auch einfach selbst ausführen.
Um ehrlich zu sein, sollten Sie nicht auf ANALYZE TABLE
eine InnoDB-Tabelle stoßen müssen, da die InnoDB-Speicher-Engine bei jeder Ausführung einer Abfrage eine Schätzung der Tabellenkardinalität basierend auf dem Durchlaufen von Seiten in den Indizes vornimmt. Wenn es eine hohe Anzahl an ist INSERTs
, UPDATEs
und DELETEs
dann müssen Sie ANALYZE TABLE
. Wenn es eine hohe Anzahl von gibt DELETEs
, dann ALTER TABLE mydb.mytable ENGINE=InnoDB;
wird benötigt, um den Tisch zu verkleinern.
Ich habe tatsächlich ANALYZE TABLE
in bestimmten Fällen Posts über die Sinnlosigkeit von auf InnoDB geschrieben:
OPTIMIZE TABLE
." Wenn SieOPTIMIZE TABLE
für eine InnoDB-Tabelle arbeiten, führt MySQL dieALTER TABLE ... ENGINE=InnoDB
undANALYZE TABLE ...
-Operationen für Sie aus, wenn stattdessen "Tabelle neu erstellen + analysieren" angezeigt wird.OPTIMIZE TABLE dat;
in MySQL 5.5.29 und es sofort beschwert,Table does not support optimize, doing recreate + analyze instead
. Deshalb empfehle ichALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
.OPTIMIZE TABLE
auf InnoDB arbeiten, führt der Server tatsächlichALTER TABLE ... ENGINE=InnoDB
undANALYZE TABLE
hinter den Kulissen aus, bevor er diese Antwort zurückgibt. Sie können also tatsächlichOPTIMIZE TABLE
auf InnoDB arbeiten und den beabsichtigten Effekt erzielen.Abhängig von Ihrer Version von MySQL und der Speicher-Engine, aber im Allgemeinen:
OPTIMIZE TABLE Analysiert die Tabelle, speichert die Schlüsselverteilung für eine Tabelle, gewinnt den nicht verwendeten Speicherplatz zurück und defragmentiert die Datendatei .
ANALYSETABELLE Analysiert nur die Tabelle und speichert die Schlüsselverteilung.
quelle