Que signifie «La table ne prend pas en charge l'optimisation, mais recréez + analysez à la place»?

97

Je travaille sur MySQL 5.5 et j'essaie de reconstruire l'index à l'aide d'une OPTIMIZE TABLErequête. J'obtiens l'erreur ci-dessous:

La table ne prend pas en charge l'optimisation, mais recréez + analysez à la place

Qu'est-ce que ça veut dire? Le moteur MySQL ne permet-il pas la reconstruction d'index? Que fait-on derrière ce message, au niveau du moteur MySQL 5.5?

Vikrant Plus
la source

Réponses:

190

C'est vraiment un message d'information.

Probablement, vous faites OPTIMISER sur une table InnoDB (table utilisant le moteur de stockage InnoDB, plutôt que le moteur de stockage MyISAM ).

InnoDB ne prend pas en charge OPTIMIZE comme le fait MyISAM. Cela fait quelque chose de différent. Il crée une table vide, y copie toutes les lignes de la table existante, supprime essentiellement l'ancienne table et renomme la nouvelle table, puis exécute un ANALYSE pour collecter des statistiques. C'est ce qui se rapproche le plus d'InnoDB pour faire un OPTIMISATION.

Le message que vous recevez est essentiellement un serveur MySQL répétant ce que le moteur de stockage InnoDB a dit au serveur MySQL:

Table ne prend pas en charge l'optimisation, dit le moteur de stockage InnoDB ...

"Je (le moteur de stockage InnoDB) ne fait pas d'opération OPTIMISER comme mon ami (le moteur de stockage MyISAM) le fait."

"faire recréer + analyser à la place", dit le moteur de stockage InnoDB ...

"J'ai décidé de réaliser un ensemble différent d'opérations qui aboutiront à un résultat équivalent."

spencer7593
la source
13
ok, pourriez-vous s'il vous plaît partager la façon dont vous faites.
Vikrant More
Je suis sûr que cela se trouve quelque part dans le manuel de référence MySQL; c'est un comportement attendu et il n'y a pas de quoi s'inquiéter. (Sauf que la table sera "verrouillée" et ne sera pas disponible pendant que le processus se termine, ce qui peut prendre un certain temps pour une table HUGH JASS.) Référence: https://dev.mysql.com/doc/refman/5.5/ fr / Optimize-table.html Voir la section "Détails InnoDB".
spencer7593
Vous pouvez également utiliser MySQL Workbench pour effectuer l'optimisation de la table. Consultez la documentation de l'inspecteur de schémas et de tables pour plus d'informations. Notez l'option "Optimiser la table".
Philip Olson
1
Excellente explication pour les personnes qui s'initient au monde db. Merci beaucoup
tachomi
5
Attention - ne l'utilisez pas si vous manquez d'espace disque car cela risque de provoquer l'épuisement de votre serveur en essayant de recréer la très grande table.
Danny Staple
22

OPTIMIZE TABLEfonctionne bien avec le moteur InnoDB selon l'article de support officiel: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Vous remarquerez qu'optimiser les tables InnoDB reconstruira la structure des tables et mettra à jour les statistiques d'index (quelque chose comme ALTER TABLE).

Gardez à l'esprit que ce message peut être une mention informative uniquement et que l'information très importante est le statut de votre requête: OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
sdesvergez
la source
2
Pas vraiment, MySQL donnera la raison de l'échec: échec d'écriture de fichier temporaire, échec de l'opération.
iwind
8

La meilleure option est de créer une nouvelle table avec les mêmes propriétés

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Renommez NEW.NAME.TABLE et TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Après avoir bien travaillé, supprimez

DROP TABLE <TABLE.CRASHED.BACKUP>;
tquang
la source
2
Cette méthode conserve-t-elle les index et les déclencheurs?
Joel Murphy
1
Oui bien sûr. Tous! Vous pouvez l'essayer puis utiliser phpMyAdmin pour vérifier à nouveau
tquang
1
Cela ne recrée pas la clé étrangère.
DanB
1

La meilleure option est de créer une nouvelle table, de copier les lignes dans la table de destination, de supprimer la table réelle et de renommer la table nouvellement créée. Cette méthode convient aux petites tables,

ASHOK MANGHAT
la source
3
Je suggérerais de rassembler un exemple de code pour accompagner votre réponse. Jetez un oeil à comment écrire une bonne réponse
Frits