Quelle est la différence entre optimiser la table et analyser la table dans mysql? J'ai lu les documents en ligne, mais je ne sais pas quelle est la différence.
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 de OPTIMIZE TABLE mydb.mytable;
si la table était MyISAM est la suivante:
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 le .MYD
et .MYI
fichiers 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
est /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.
Seulement /var/lib/mysql/mydb/mytable.frm
existerait. Toutes les pages de données et d'index de la table mydb.mytable
sont stockés dans le fichier d'espace de table système /var/lib/mysql/ibdata1
.
Quand OPTIMIZE TABLE mydb.mytable
est 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 le Représentation picturale 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 courir OPTIMIZE TABLE
en 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
par rapport à 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 nombre élevé de INSERTs
, UPDATEs
et DELETEs
, alors vous devrez ANALYZE TABLE
. Lorsqu'il y a un nombre élevé de DELETEs
, alors ALTER TABLE mydb.mytable ENGINE=InnoDB;
est nécessaire pour réduire la table.
J'ai en fait écrit des articles sur la futilité de ANALYZE TABLE
sur InnoDB dans certains cas:
Dépend de votre version de MySQL et du moteur de stockage mais en général:
OPTIMIZE 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.
ANALYZE TABLE Analyse uniquement la table et stocke la distribution des clés.