web-dev-qa-db-fra.com

Comment puis-je défragmenter les tables dans MySQL?

J'ai une base de données nommée comté. Le comté a une table fragmentée GEO. J'ai exécuté OPTIMIZE TABLE GEO contre la table Geo, mais cela a renvoyé l'erreur

"-tableau ne prend pas en charge Optimiser, de recréer + analysez plutôt OK".

Puis j'ai exécuté ALTER TABLE GEO ENGINE='InnoDB'; Et puis est allé pour ANALYZE TABLE GEO. Mais il a toujours une fragmentation.

Enfin, je l'ai laissé tomber et j'ai recommencé. Il a toujours une fragmentation. Quelqu'un peut-il m'aider s'il vous plaît, comment puis-je le défragmenter?

2
Krunal Patel

Aspect n ° 1

Le message que vous avez vu n'a pas dit

" Tableau ne prend pas en charge Optimiser, ne recréez + analysez plutôt OK "

mais le message a dit

" Tableau ne prend pas en charge Optimiser, de recréer + analyser à la place OK "

Cela signifie que le moteur de stockage InnoDB déjà exécuté

ALTER TABLE GEO ENGINE='InnoDB';
ANALYZE TABLE GEO;

Il n'y avait pas besoin de le refaire.

Aspect n ° 2

Il y a une raison pour laquelle la fragmentation existe toujours

Si la clé primaire du tableau est un entier avec auto_incrènement, tous les numéros générés pour la clé principale sont en ordre croissant.

Lorsque la clé primaire était chargée dans l'indice BTTREE, la fragmentation a été faite. Pourquoi?

Vous trouverez peut-être cela surprenant, mais j'ai écrit une réponse à un message il y a environ 3 ans intitulé À quel point l'innodif est-il fragment innodube face à des insertions quelque peu sur les commandes?

Dans ce poste, j'ai expliqué comment les arbres binaires AVL provoqueront une rotation de la hauteur d'environ 45% du temps. Pour un BTREE, cela serait représenté comme des fissures de page BTRee. Qu'est-ce que signifie pour trier des données?

  • Lors du chargement de données dans l'ordre croissant, les pages d'arborescence qui se sont scindées à gauche seraient toujours à moitié pleines
  • Lors du chargement des données dans l'ordre décroissant, les pages d'arborescentes qui se sont scindées à droite seraient toujours à moitié pleines

Ces demi-pages complètes sont ce qui manifeste la fragmentation.

Ceci est en outre illustré dans un autre poste que j'ai écrit l'année dernière ( pourquoi la taille de MySQL Myisam Table Index (Aka Myi Fichier) ne correspond pas après l'importation MySqldump? ) Où j'ai mentionné ce même problème pour Myisam.

CONCLUSION

Le seul moyen de réduire réellement la fragmentation serait de supprimer tous les index et de recréer les index. Si les tables sont gigantesques, cela ne vaut pas votre temps.

3
RolandoMySQLDBA

Les tables n'auront pas zéro fragmentation dans les meilleures circonstances. Vous avez fait tout ce que vous avez recommandé de réduire sa fragmentation. Il est temps de passer au problème suivant.

1
O. Jones