Was ist der Unterschied zwischen Tabelle optimieren und Tabelle analysieren in MySQL?

29

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.

Boolean
quelle

Antworten:

28

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;

MyISAM

Für die MyISAM-Tabelle mydb.mytable in datadir /var/lib/mysqlhaben 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.mytablewürde die .MYDund .MYIDateien für die Tabelle verkleinern .

Dies gilt nicht für InnoDB. So ist es anders:

InnoDB ( innodb_file_per_table enabled)

Die Daten und Indizes jeder Tabelle werden in einer externen Tablespace-Datei gespeichert. Für datadiris /var/lib/mysql und die Tabelle mydb.mytablewürde es wie folgt gespeichert:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Wenn OPTIMIZE TABLE mydb.mytableausgeführt wird, mytable.ibdwird geschrumpft.

InnoDB ( innodb_file_per_table deaktiviert)

Nur /var/lib/mysql/mydb/mytable.frmwürde existieren. Alle Daten- und Indexseiten für die Tabelle mydb.mytablewerden in der System-Tablespace-Datei gespeichert /var/lib/mysql/ibdata1.

Bei der OPTIMIZE TABLE mydb.mytableAusfü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

InnoDB Sanitär

UPDATE 26.02.2013 22:33 EST

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 TABLEals 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 TABLEeine 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, UPDATEsund DELETEsdann 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 TABLEin bestimmten Fällen Posts über die Sinnlosigkeit von auf InnoDB geschrieben:

RolandoMySQLDBA
quelle
Ich denke, Optimierungstabelle für Innodb wird nicht unterstützt. Ich habe eine Nachricht erhalten, der Index wird neu erstellt. Wie funktioniert es?
Boolescher
@RolandoMySQLDBA Ich bin mir nicht sicher, was es bedeutet, wenn Sie sagen: "Sie können nicht rennen OPTIMIZE TABLE." Wenn Sie OPTIMIZE TABLEfür eine InnoDB-Tabelle arbeiten, führt MySQL die ALTER TABLE ... ENGINE=InnoDBund ANALYZE TABLE ...-Operationen für Sie aus, wenn stattdessen "Tabelle neu erstellen + analysieren" angezeigt wird.
Michael - sqlbot
Wie @ Michael-sqlbot in meiner Antwort gezeigt, lief ich OPTIMIZE TABLE dat;in MySQL 5.5.29 und es sofort beschwert, Table does not support optimize, doing recreate + analyze instead. Deshalb empfehle ich ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
RolandoMySQLDBA
Richtig, aber ich würde behaupten, dass es für Sie sofort passiert ist, weil der Tisch, an dem Sie getestet haben, sehr klein war. Wenn Sie OPTIMIZE TABLEauf InnoDB arbeiten, führt der Server tatsächlich ALTER TABLE ... ENGINE=InnoDBund ANALYZE TABLEhinter den Kulissen aus, bevor er diese Antwort zurückgibt. Sie können also tatsächlich OPTIMIZE TABLEauf InnoDB arbeiten und den beabsichtigten Effekt erzielen.
Michael - sqlbot
15

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.

Mitch Weizen
quelle