Réponses:
Pour développer la réponse de @ MitchWheat (+1 pour répondre directement en premier):
ANALYZE TABLE examine la distribution des clés et les stocke dans INFORMATION_SCHEMA.STATISTICS .
OPTIMIZE TABLE exécute ANALYZE TABLE après avoir effectué une compression de table. L'équivalent deOPTIMIZE TABLE mydb.mytable;
si la table était MyISAM est le suivant:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Pour la table MyISAM mydb.mytable dans datadir /var/lib/mysql
, vous disposez des fichiers suivants:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(Les données)/var/lib/mysql/mydb/mytable.MYI
(index)OPTIMIZE TABLE mydb.mytable
réduirait les fichiers .MYD
et .MYI
pour la table.
Ce n'est pas la même chose pour InnoDB. Voici comment c'est différent:
Les données et index de chaque table sont stockés dans un fichier d'espace disque logique externe. Pour datadir
is /var/lib/mysql
et le tableau mydb.mytable
, il serait stocké comme suit:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Quand OPTIMIZE TABLE mydb.mytable
est exécuté, mytable.ibd
se rétrécit.
Seul /var/lib/mysql/mydb/mytable.frm
existerait. Toutes les pages de données et d'index de la table mydb.mytable
sont stockées dans le fichier d'espace disque logique système /var/lib/mysql/ibdata1
.
Une fois OPTIMIZE TABLE mydb.mytable
exécuté, les pages de données et d'index sont écrites de manière contiguë dans ibdata1. Malheureusement, cela fait que ibdata1 grandit à pas de géant.
Voir la représentation graphique de Percona CTO Vadim Tkachenko
Votre commentaire était
Je pense que l'optimisation de la table pour innodb n'est pas prise en charge. J'ai reçu un message, l'index sera recréé. Comment ça marche?
J'ai essayé
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>
Vous avez raison. Vous ne pouvez pas exécuter OPTIMIZE TABLE
une seule opération. Ce que fait InnoDB à la place est le suivant:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Vous pouvez également exécuter ces étapes vous-même.
Cependant, en toute honnêteté, vous ne devriez pas avoir à exécuter ANALYZE TABLE
une table InnoDB car chaque fois qu'une requête est exécutée, le moteur de stockage InnoDB effectue une estimation de la cardinalité de la table basée sur le passage des pages dans les index. S'il y a un grand nombre de INSERTs
, UPDATEs
et DELETEs
, alors vous devrez ANALYZE TABLE
. Lorsqu'il y a un nombre élevé de DELETEs
, il ALTER TABLE mydb.mytable ENGINE=InnoDB;
faut alors réduire la table.
J'ai en fait écrit des articles sur la futilité d' ANALYZE TABLE
InnoDB dans certains cas:
Oct 16, 2011
: Il faut soudain reconstruire les index pour éviter que le site ne tombe en panneJun 21, 2011
: D'où MySQL Query Optimizer lit-il les statistiques d'index?OPTIMIZE TABLE
". Lorsque vous OPTIMIZE TABLE
créez une table InnoDB, MySQL effectue les opérations ALTER TABLE ... ENGINE=InnoDB
et ANALYZE TABLE ...
pour vous lorsqu'il dit "faire recréer + analyser la table à la place".
OPTIMIZE TABLE dat;
dans MySQL 5.5.29 et immédiatement plaignais, Table does not support optimize, doing recreate + analyze instead
. Voilà pourquoi je recommande ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
.
OPTIMIZE TABLE
utilisez InnoDB, le serveur exécute en fait ALTER TABLE ... ENGINE=InnoDB
et ANALYZE TABLE
dans les coulisses avant de renvoyer cette réponse ... afin que vous puissiez en effet exécuter OPTIMIZE TABLE
sur InnoDB et obtenir l'effet escompté.
Dépend de votre version de MySQL et du moteur de stockage mais en général:
OPTIMISER LA TABLE Analyse la table, stocke la distribution des clés d'une table, récupère l'espace inutilisé et défragmente le fichier de données.
ANALYSER LA TABLE Analyse uniquement la table et stocke la distribution des clés.