it-swarm.com.de

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

Was ist der Unterschied zwischen Tabelle optimieren und Tabelle in MySQL analysieren? Ich habe die Online-Dokumente gelesen, bin mir aber nicht sicher, was der Unterschied ist.

31
Boolean

So erweitern Sie @ MitchWheats Antwort (+1 für die direkte Antwort zuerst):

ANALYZE TABLE untersucht die Schlüsselverteilung und speichert sie in INFORMATION_SCHEMA.STATISTICS .

OPTIMIZE TABLE führt ANALYZE TABLE nach einer Tabellenkomprimierung. Das Äquivalent von OPTIMIZE TABLE mydb.mytable; Wenn die Tabelle MyISAM war, lautet:

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;

MyISAM

Für die MyISAM-Tabelle mydb.mytable in datadir /var/lib/mysql Haben Sie die folgenden 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 Dateien .MYD Und .MYI 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 datadir ist /var/lib/mysql Und die Tabelle mydb.mytable Würde wie folgt gespeichert:

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

Wenn OPTIMIZE TABLE mydb.mytable Ausgeführt wird, wird mytable.ibd Verkleinert.

InnoDB ( innodb_file_per_table deaktiviert)

Es würde nur /var/lib/mysql/mydb/mytable.frm Existieren. Alle Daten- und Indexseiten für die Tabelle mydb.mytable Werden in der Systemtabellenbereichsdatei /var/lib/mysql/ibdata1 Gespeichert.

Wenn OPTIMIZE TABLE mydb.mytable Ausgeführt wird, werden die Daten- und Indexseiten zusammenhängend in ibdata1 geschrieben. Leider wächst dadurch ibdata1 sprunghaft.

Siehe Bilddarstellung von Percona CTO Vadim Tkachenko

(InnoDB Plumbing

UPDATE 26.02.2013 22:33 EST

Ihr Kommentar war

Ich denke, Tabelle für Innodb optimieren 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 OPTIMIZE TABLE Nicht als einzelne Operation ausführen. InnoDB macht stattdessen Folgendes:

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 jedoch nicht ANALYZE TABLE Für eine InnoDB-Tabelle ausführen müssen, da die InnoDB Storage Engine bei jeder Ausführung einer Abfrage eine Schätzung der Tabellenkardinalität basierend auf dem Durchlaufen von Seiten in den Indizes durchführt. Wenn es eine hohe Anzahl von INSERTs, UPDATEs und DELETEs gibt, müssen Sie ANALYZE TABLE. Wenn es eine hohe Anzahl von DELETEs gibt, wird ALTER TABLE mydb.mytable ENGINE=InnoDB; Zum Verkleinern der Tabelle benötigt.

Ich habe tatsächlich Beiträge über die Sinnlosigkeit von ANALYZE TABLE Auf InnoDB in bestimmten Fällen geschrieben:

29
RolandoMySQLDBA

Hängt von Ihrer Version von MySQL und der Speicher-Engine ab, aber im Allgemeinen:

OPTIMIZE TABLE Analysiert die Tabelle, speichert die Schlüsselverteilung für eine Tabelle, beansprucht den nicht verwendeten Speicherplatz zurück und defragmentiert die Datendatei.

ANALYZE TABLE Analysiert nur die Tabelle und speichert die Schlüsselverteilung.

15
Mitch Wheat