Passer vos tables du moteur MyISAM au moteur InnoDB

MySQLBonjour à tous,

Si comme moi vous avez des tables en MyISAM (moteur par défaut jusqu’à la 5.5.5)  et que vous vous êtes enfin décidé à migrer votre MySQL en >= 5.5.5 , vous allez peut être devoir revoir vos index et basculer vos tables sur le moteur InnoDB.

/!\ La suppression / création d’index + changement de moteur peut être une opération très longue suivant la taille de votre table, la configuration de votre serveur MySQL (my.cnf) et la configuration matérielle de votre serveur. Il est important de ne pas changer le moteur des tables dans la base de données mysql (comme user ou host/!\

Si vous avez tout de même décidé d’effectuer cette modification.

  • Pemière solution : changer directement le moteur de la table :

Vérifiez d’abord les index que vous avez avant de les supprimer car le fonctionnement des index en InnoDB est différent. un travail de réflexion sur les index doit être fait en amont afin de bien mesurer l’impact d’une telle opération.

SHOW INDEX FROM votre_table;

Suppression du ou des index :

ALTER TABLE votre_table drop index index_1;

Modification du moteur :

ALTER TABLE votre_table ENGINE=InnoDB

Création des nouveaux index  :

ALTER TABLE votre_table ADD INDEX `index_1` (`column1`,`column2`,`column3`,`column4`);

Et voila, c’est terminé, simple non ? Oui en admettant que les index, la configuration d’un serveur MySQL, le fonctionnement des différents moteurs n’aient plus de secret pour vous. Ce n’est pas encore mon cas en tout cas. Donc attention de bien mesurer les impacts d’une telle modification sur les performances de votre application.

  • Deuxième solution : créer un clone de la table

Une autre solution est possible afin de pouvoir comparer les performances de lecture/écriture sur votre nouvelle table en InnoDB versus MyISAM.

Récupérer la structure actuelle de la table :

SHOW CREATE TABLE your_table \G

Then create the InnoDB table changing the « ENGINE=MyISAM » to « ENGINE=InnoDB ». You may delete indexes or not because they will maybe not fit to the new InnoDB engine.
Insert into your new table the data :

INSERT INTO innodb_table SELECT * FROM myisam_table ORDER BY primary_key_columns.

After that you can create new indexes.

ALTER TABLE your_table ADD INDEX `index_1` (`column1`,`column2`,`column3`,`column4`);

Et voilà, ,c’est fini pour la deuxième solution !

De nombreux autres critères sont à prendre en compte avant d’effectuer ce genre de modification, notamment au niveau des paramètres de configuration et MySQL qui vont être différent entre le moteur MyISAM et InnoDB ainsi que l’espace de stockage utilisé et la mémoire.

Pour plus d’information vous pouvez consulter la section de documentation concernant la modification de moteur pour MySQL 5.6 ou MySQL 5.5

A bientôt !

Etienne

PS: Si le contenu de cet article vous semble erroné ou pas assez précis, merci de me le signaler dans les commentaires et ou par mail à contact@etiennegautier.net

Tags: , , , , , ,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.